将数字分配给两个“容器”并最小化它们的总和差异

时间:2011-12-23 03:47:11

标签: algorithm dynamic-programming

假设有n个数字,我们说我们有以下4个数字15,20,10,25

有两个容器A和B,我的工作是为他们分配数字,以便每个容器中数字的总和差别最小。

在上面的例子中,A应该有15 + 20而B应该有10+ 25.所以差异= 0.

我想到了一种方法。它似乎有效,但我不知道为什么。

  

首先按降序对数字列表进行排序。在每轮中,取出最大数量   并且放入容器的总和较少。

不过,它可以通过DP解决吗? THX

1 个答案:

答案 0 :(得分:4)

  1. 事实上,您的方法并不总是有效。考虑一下2,4,4,5,5。您的方法的结果为(5,4,2)(5,4),而最佳答案为(5,5)(4,4,2)

  2. 是的,可以通过动态编程解决。这是一些有用的链接:

      

    教程和代码:http://www.cs.cornell.edu/~wdtseng/icpc/notes/dp3.pdf
      练习:http://people.csail.mit.edu/bdean/6.046/dp/(然后点击Balanced Partition

  3. 更重要的是,请注意,如果问题的规模太大(比如你有500万个数字等),你就不会想要使用需要太大矩阵的DP。如果是这种情况,您需要使用一种蒙特卡罗算法:

      
        
    1. 将n个数字随机分成两组(如果您愿意,可在此步骤中使用您的方法);
    2.   
    3. 从每个组中选择一个数字,如果(交换这两个数字减少总和的差异)交换它们;
    4.   
    5. 重复步骤2,直到“长时间未发生交换”。
    6.   

    你不希望这种方法总能得到最好的答案,但这是我知道在合理的时间和内存中以非常大的规模解决这个问题的唯一方法。