什么是将一组项目公平地分成3个独立组的算法?

时间:2012-01-06 17:57:11

标签: algorithm dynamic-programming

我的教科书中有这个问题: 给定一组n个项目,每个项目具有不同的值V(i),将项目划分为3个组的最佳方法是什么,以便将具有最高值的组最小化?给出这个最大群体的价值。

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

答案:与0-1背包几乎完全相同,尽管是2D

3 个答案:

答案 0 :(得分:1)

艰苦的家庭作业问题。这基本上是3分区问题的优化版本。

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

它与bin pack,partition和subset-sum密切相关(正如你所说,背包)。然而,它恰好是强NP完全,这使它比它的表兄弟更难。无论如何,我建议你先从相关问题的动态编程解决方案开始(我从分区开始,但找到DP解决方案的非维基百科解释)。

更新:我道歉。我误导了你。 3分区问题将输入分成3组而不是3组。我所说的其余内容仍然适用,但重申希望你的变体不是强烈的np-complete。

答案 1 :(得分:1)

设f [i] [j] [k]表示第一组中是否有值j ,第二组中是值k 第一件物品

所以我们有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,更新您的答案取决于您如何定义公平

答案 2 :(得分:0)

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

示例:

1 3 7 9 10
becomes
4(1+3) 7 9 10
becomes
9 10 11(1+3+7)
相关问题