给定是一组元素。你必须将它们分成两组,这样一个组的元素总和之间的差异是最小的。
示例:
5
4 6 7 2 1
两组是:{4,6}
和{7,2,1}
。
我的方法:我只遇到了这个问题的强力解决方案,即使用位移技术生成集合的所有子集(2^n)
。
我正在寻找更好的解决方案。
答案 0 :(得分:2)
我会给你两个提示,而不是给你解决方案:
计算所有元素的总和,而不是解决原始问题。表示S
。解决如下所述的问题 - 找到给定数字的子集,其总和不超过S/2
。其余的数字将构成另一个子集。
我上面描述的问题非常简化knapsack problem,所有元素的成本相同。同样可以使用dynamic programming来解决(但在这种情况下,它将比用于经典背包问题的方法更简单)