2个相同容量的背包-为啥我们不能两次找到最大值
Posted
技术标签:
【中文标题】2个相同容量的背包-为啥我们不能两次找到最大值【英文标题】:2 knapsacks with same capacity - Why can't we just find the max-value twice2个相同容量的背包-为什么我们不能两次找到最大值 【发布时间】:2015-07-29 09:40:20 【问题描述】:如果给你一组具有价值和重量的物品:[(w1,v2),(w2,v2),...(wn,vn)],以及两个容量相同的背包 Knap1 和 Knap2 C,目标是确定哪些物品 S1 和 S2 的最优子集可以分别进入 Knap1 和 Knap2 并最大化背包的价值和容量。
解决此问题的错误方法是首先使用 DP 编程算法将所有项作为候选项填充 Knap1,然后使用 Knap1 中剩余的项填充 Knap2。
如果两个背包的容量相等,我不明白为什么这个算法不正确。有人可以解释一下或举个例子吗?
【问题讨论】:
【参考方案1】:一个反例: 集合 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_1
和 s_3
,这将产生价值 12
。现在是第二个背包,左边有s_4
和s_2
。因此,您的算法将选择s_4
,这将导致值7
。 s_2
将被留下。
总值:19
最佳解决方案是在一个背包中使用s_1
和s_4
,在另一个背包中使用s_2
和s_3
。
最优总值:20
【讨论】:
【参考方案2】:假设背包的容量是10,我们有这些物品(重量,价值):
(8, 200) (1, 10) (1, 10) (2, 15) (9, 100)
只看一个背包的贪心算法会使用重量为 8、1 和 1 的物体来得分 220 值,但是当你考虑到两个麻袋都清楚地留下 1 并拿走 2 时更好。
【讨论】:
'greedy' 在这里是指只查看一个背包并找到该麻袋的最佳解决方案,而不考虑第二个麻袋。如何找到第一个 sack 的最佳解决方案(DP 或任何其他算法)与这个答案(和问题)无关。以上是关于2个相同容量的背包-为啥我们不能两次找到最大值的主要内容,如果未能解决你的问题,请参考以下文章