把一堆数字分成两堆
比较好的方法是使用DP,把所有集合内元素能达到的部分和标记出来
例如有数字
{ 1, 3, 4, 5 }
则可以达到的部分和从小到大为:
1=1
3=3
4=4
5=5
6=1+5
7=3+4
8=3+5
9=4+5
10=1+4+5
...
然后只要从总和的一半开始,往少的方向寻找第一个存在的部分和就可以了,也就是最大的部分和
设总和为sum,最大部分和为partsum,
则两堆数最小的差值为 ( sum - partsum ) - partsum
参考代码如下: