2个容量相同的背包 - 为什么我们不能只找到两次最大值

时间:2015-07-29 09:40:20

标签: algorithm dynamic-programming knapsack-problem

如果给你一组具有值和重量的物品:[(w1,v2),(w2,v2),...(wn,vn)],以及两个容量相等的背包Knap1和Knap2,目标是确定分别可以进入Knap1和Knap2的项目S1和S2的最佳子集,并最大化背包的值和容量。

解决这个问题的一种不正确的方法是首先使用所有项目作为候选项的DP编程算法填充Knap1,然后使用Knap1中的剩余项目填充Knap2。

如果两个背包的容量相等,我不明白为什么这个算法不正确。有人可以解释或举例吗?

2 个答案:

答案 0 :(得分:8)

反例
设置项目S:(w_i,v_i)

   s_1=(1,2) , s_2=(2,1) , s_3=(3,10) , s_4=(4,7) 

背包的容量:c_1 = c_2 = 5

您的第一轮DP将会使用s_1s_3项,这将导致值12。现在换了第二个背包,剩下s_4s_2。因此,您的算法将选择s_4,这将产生值7s_2将遗留下来 总价值:19

最佳解决方案在一个背包中为s_1s_4,在另一个中为s_2s_3。 最佳总价值:20

答案 1 :(得分:5)

假设背包的容量为10,我们有这些物品(重量,值):

(8,200) (1,10) (1,10) (2,15) (9,100)

只看一个背包的贪婪算法会使用重量为8,1和1的物体来获得220的值,但是当你认为两个麻袋明显离开1并且拿2时更好。