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_1s_3,这将产生价值 12。现在是第二个背包,左边有s_4s_2。因此,您的算法将选择s_4,这将导致值7s_2 将被留下。 总值:19

最佳解决方案是在一个背包中使用s_1s_4,在另一个背包中使用s_2s_3。 最优总值:20

【讨论】:

【参考方案2】:

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

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

只看一个背包的贪心算法会使用重量为 8、1 和 1 的物体来得分 220 值,但是当你考虑到两个麻袋都清楚地留下 1 并拿走 2 时更好。

【讨论】:

'greedy' 在这里是指只查看一个背包并找到该麻袋的最佳解决方案,而不考虑第二个麻袋。如何找到第一个 sack 的最佳解决方案(DP 或任何其他算法)与这个答案(和问题)无关。

以上是关于2个相同容量的背包-为啥我们不能两次找到最大值的主要内容,如果未能解决你的问题,请参考以下文章

没有重复的背包:最大数量的金币

动规基础——01背包问题(背包问题Ⅱ)

01背包问题(动态规划)

HUSTOJ 1072 小数背包问题

饭卡(01背包问题)

0/1背包-递归算法