【问题标题】:What is an algorithm to split a group of items into 3 separate groups fairly?将一组项目公平地分成 3 个单独的组的算法是什么?
【发布时间】:2012-02-04 10:36:21
【问题描述】:

我的课本中有这个问题: 给定一组 n 个项目,每个项目都有一个不同的值 V(i),将项目分成 3 组以使具有最高值的组最小化的最佳方法是什么?给出这个最大组的值。

我知道如何解决这个问题的 2 堆变体:它只需要在问题上反向运行背包算法。但是,我很困惑如何解决这个问题。谁能给我指点?

答案:和 0-1 背包差不多,虽然是 2D 的

【问题讨论】:

  • 既然来了又消失了,下面是贪心失败的例子{100, 51, 49, 40, 30, 20, 10}。最佳答案是完美分割,而不是贪婪地将最大的未分配元素应用于最小的组。
  • 我有同样的教科书。布赖恩·迪恩(Brian Dean)给了我;)

标签: algorithm dynamic-programming


【解决方案1】:

棘手的家庭作业问题。这本质上是 3 分区问题的优化版本。

http://en.wikipedia.org/wiki/3-partition_problem

它与装箱、分区和子集和(以及,正如您所说的背包)密切相关。然而,它恰好是强 NP-Complete,这使得它比它的表亲更难。无论如何,我建议您从查看相关问题的动态编程解决方案开始(我会从分区开始,但找到 DP 解决方案的非维基百科解释)。

更新:我很抱歉。我误导了你。 3 分区问题将输入分成 3 组,而不是 3 组。我所说的其余部分仍然适用,但再次希望您的变体不是强 np-complete。

【讨论】:

  • @RichieLi 诚实的问题:为了不破坏问题,你想让我知道多少细节?即期望的递归关系是否太多(不是我有它,我必须自己解决)?
  • 呵呵,我自己试试。时间是晚上,所以如果我需要更多帮助,我会尽快回复您。
  • 更新:我有一个动态编程解决方案。如果您需要,我可以提供更多提示。如果您想要一个巨大的提示(可能是剧透),这些关于子集和的讲义基本上可以为您提供所需的一切:sites.cs.queensu.ca/courses/cisc365/Record/Week06/20111018.html
  • @SaeedAmiri:套用你的话,你有没有看过你评论的回复?我不仅更新了回复(发布后 30 分钟,在您发表评论前 6 个月)声明它是 not 3 分区,而且我提供了一个参考链接,其中包含有关如何通过动态规划解决问题。
  • @ccoakley,是的,你修复了它,但编辑你的答案并删除错误的部分。今天又问了类似的问题,有人把它与这个联系起来,我读了你的答案的第一段,实际上对我来说如何解决它并不重要,重要的是看到一个正确的答案并关闭新问题。跨度>
【解决方案2】:

令 f[i][j][k] 表示是否有可能在第一个集合中有 value j,在第二个集合中有 value k,有前 i 项

所以我们有f[i][j][k] = f[i-1][j-v[i]][k] or f[i-1][j][k-v[i]]

最初我们有f[0][0][0] = True

对于每个f[i][j][k] = True,更新你的答案取决于你如何定义相当

【讨论】:

  • 但是第i项也可以进入第三组,所以我认为应该是f[i][j][k] = f[i-1][j-v[i]][k] or f[i-1][j][k-v[i]] or f[i-1][j][k]
  • 另外,为了说明这一点,当考虑 f[i][j][k] = True 的一些 i、j、k 的解决方案时,您将计算第三组的权重使用 s[i] - j - k,其中 s[i] 是前 i 个项目的权重之和(在开始时以线性时间预先计算)。
【解决方案3】:

从数学上讲,我不知道“最佳”是什么,但一种明显的方法是建立一个群体群体,最初每个群体中有一个项目。然后,只要您的组数多于所需的最终组数,就提取具有最低值的两个组,并将它们组合成一个新组,然后再添加回集合中。这类似于构建 Huffman 压缩树的方式。

例子:

1 3 7 9 10
becomes
4(1+3) 7 9 10
becomes
9 10 11(1+3+7)

【讨论】:

  • 我们还没有了解到这一点,所以我不认为我应该在这个问题上使用它。
  • 挑选尼特:贪婪方法在霍夫曼情况下是最佳的(对于固定字母的可变长度编码)。只有当问题中的数字分布良好(我不能比“很好”这个词更精确)时,它才能合理地执行分区。鉴于该问题被标记为“动态编程”,我猜想分配的目的不是使用贪婪技术。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-09-25
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多