我的教科书中有这个问题: 给定一组n个项目,每个项目具有不同的值V(i),将项目划分为3个组的最佳方法是什么,以便将具有最高值的组最小化?给出这个最大群体的价值。
我知道如何处理这个问题的2堆变体:它只需要在问题上向后运行背包算法。但是,我很困惑如何解决这个问题。谁能给我任何指示?
答案:与0-1背包几乎完全相同,尽管是2D
答案 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)