algorithm - 通过将集合分成两个子集来找到可以从集合中形成的最大总和

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

说明

给定一组数字 S。
找到最大总和使得
总和(A1) = 总和(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 <= 总和(S) <= 1000000
2 <= len(S) <= 100
时间限制:60 秒(可能因使用的语言而异)

最佳答案

是的,是NPC的问题 Partition Problem

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

关于algorithm - 通过将集合分成两个子集来找到可以从集合中形成的最大总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247004/

相关文章:

algorithm - 从有序列表创建随机有序列表

c# - 命名空间 '<global namespace>' 已经包含了 'Workflow' 的定义

for-loop - 在 for 循环中重复调用内核的 CUDA 程序的性能受到影响

haskell - 这个简单的haskell程序的解释(动态编程)

language-agnostic - 解决 NP-Complete 问题的最佳运行时间?

algorithm - NP 完全 VS NP 困难

algorithm - 将 TSP 减少到哈密顿电路

c - 这个快速排序有什么问题吗?

python - N == N 的数字和的某次幂(运行太慢)

algorithm - 关于保护/加密代码的建议