【问题标题】:Finding the maximum sum that can be formed from a set, by partitioning it into two subset通过将集合划分为两个子集来找到可以从集合中形成的最大和
【发布时间】:2025-11-30 08:05:02
【问题描述】:

说明

给定一组数字 S。
找到最大总和,使得
Sum(A1) = Sum(A2)
其中,A1⊂S 和 A2⊂S 和 A1⋂A2=∅
Sum(X) 是集合 X 中所有元素的总和。

方法

蛮力

最简单的方法是:

print maximumSum(0,0,0)
def maximumSum(index,sum1,sum2):
  ans=0
  if sum1 == sum2:
    ans=sum1
  if index >= len(S):
    return ans
  m1=maximumSum(index+1,sum1+S[index],sum2)
  m2=maximumSum(index+1,sum1,sum2+S[index])
  m3=maximumSum(index+1,sum1,sum2)
  return max(m,m1,m2,m3)

时间复杂度:O(2N)
空间复杂度:O(1)

还有比这更好的方法吗?
可选:
我想知道给定的问题是否是 NP 完全问题。

编辑:

限制

1 2 时间限制:60 秒(可能因使用的语言而异)

【问题讨论】:

    标签: algorithm dynamic-programming np-complete subset-sum


    【解决方案1】:

    是的,是NPC问题 Partition Problem

    如果集合的和很小,可以看到伪多项式算法部分

    【讨论】:

    • 我已经添加了问题的限制,您建议的分区问题也是找到一个具有给定总和的子集,问题指出我们需要两个具有相同总和的不同集合。
    • 我错过了什么还是什么?该页的第一句话:“...划分问题是决定是否可以将给定的正整数多重集 S 划分为两个子集 S1 和 S2,使得 S1 中的数字之和等于S2 中的数字。”,两组 S1 和 S2,其中 S1 = S2,这不是你想要的吗?
    • 最大值 总和使得 ,Sum(A1) = Sum(A2)
    • 首先,我觉得还是NPC,还是用同样的方法解决分区问题? (而且听起来比分区问题更难)其次,如果是NPC,就不会有O(N^3)或O(N^4)的解决方案......我能想到的最好的是O( N^2 总和(S))。那么你想要什么,你想要一个 O(N^3) 解决方案还是证明它是一个 NPC 问题?
    • O(N^2 *Sum(S)) 也可以。我正在努力寻找解决方案。