[英]Distribute numbers to two “containers” and minimize their difference of sum
假设有n个数字,我们说我们有以下4个数字15,20,10,25
有两个容器A和B,我的工作是将数字分配给它们,以便每个容器中的数字总和具有最小的差异。
在上面的例子中,A应该有15 + 20而B应该有10+ 25.所以差异= 0。
我想到了一种方法。 它似乎工作,但我不知道为什么。
首先按降序对数字列表进行排序。 在每一轮中,取出最大数量并放入容器中的总和较少。
顺便问一下,DP可以解决吗? 谢谢
实际上, 您的方法并不总是有效 。 想想那个2,4,4,5,5
。你的方法的结果将是(5,4,2)(5,4)
,而最好的答案是(5,5)(4,4,2)
。
是的,它可以通过动态编程来解决。这里有一些有用的链接:
教程和代码: http : //www.cs.cornell.edu/~wdtseng/icpc/notes/dp3.pdf
练习: http : //people.csail.mit.edu/bdean/6.046/dp/ (然后单击Balanced Partition
)
更重要的是,请注意,如果问题的规模太大(比如你有500万个数字等),你就不会想要使用需要太大矩阵的DP。 如果是这种情况,您想使用一种蒙特卡罗算法:
- 随机将n个数字分成两组(如果你愿意,可以在这一步使用你的方法);
- 从每个组中选择一个号码,
如果(交换这两个数字减少总和的差异)交换它们;- 重复步骤2,直到“长时间未发生交换”。
你不希望这种方法总能得到最好的答案,但这是我知道在合理的时间和内存中以非常大的规模解决这个问题的唯一方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.