这个问题涉及尝试将不同重量的物品装入袋子中,以使袋子以指定的总重量或最接近总的指定重量结束 .
Example 1 :- Bag can hold max up to 240 kg of weight
Item1-60kg,Item2-30kg,Item3-55kg,Item4-60kg,Item5-80kg,Item6-40kg,Item7- 7kg,
这里选择的项目应该是Item1,Item4,Item5和Item6(60 60 80 40 = 240 kg)
Example 2 :- Bag can hold max up to 180 kg of weight
Item1-60kg,Item2-30kg,Item3-55kg,Item4-30kg,Item5-70kg,Item6-48kg
这里选择的项目应该是Item1,Item4,Item5和Item6(60 70 48 = 178 kg)
最接近180公斤
Here is my template method
public List getSelectedItems(List<Presentation> inputList, int knapsackCapacity){
List selectItems;
// optimized algorith which returns selectItems and inputList containing the
//left out items i.e which are not selected;
return selectItems;
}
网上的一些人称之为Knapsack problem的最简单形式,因为它没有与之相关的任何利益/利润,有些人称之为Change-making problem
无论它属于什么类别,我都无法获得此算法,因此无法使Java程序脱颖而出 . 有什么帮助吗?
3 回答
使用动态编程可以在伪多项式时间(
O(nW)
)中最佳地解决此问题 . 你需要做的是修改一下Knapsack 0/1的解决方案,如下所示:其中
W
是权重限制,w
是元素权重数组 . 不同之处在于您必须最小化W
与结果之间的差异,而不是最大化值的总和 .以下是具有所需修改的wikipedia解决方案:
二维数组
m
是记忆表,在算法结束时,m[k, p]
为0到k
之间的元素保存最佳解决方案,最大权重为p
.编辑:我在
C++
中实现并测试了它,它应该很容易移植到Java:我喜欢这个问题所以只想分享我的方法
我同意不真实的分析 . 但是这可以通过背包解决方案的任何修改来解决这个问题 . 只需考虑与权重相同的权重值 . 然后我们不必修改背包程序 . 这是一个例子