【问题标题】:Distribute numbers to two "containers" and minimize their difference of sum将数字分配给两个“容器”并最小化它们的总和差异
【发布时间】:2012-01-26 13:51:33
【问题描述】:

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

有两个容器 A 和 B,我的工作是给它们分配数字,使每个容器中的数字之和相差最小。

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

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

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

顺便说一句,DP能解决吗? 谢了

【问题讨论】:

标签: algorithm dynamic-programming


【解决方案1】:
  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。如果是这种情况,您想使用一种 Monte Carlo 算法:

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

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

【讨论】:

  • 您能否详细说明一下,因为我真的迫不及待地想完整阅读它,并且我看到“当且仅当有一个数字的子集具有总和 x 时,T[x] 才会为真”纸的开始。我认为基本思想是dp也是一个背包填充问题。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2020-04-07
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
相关资源
最近更新 更多