2袋0-1背包的算法?

Posted

技术标签:

【中文标题】2袋0-1背包的算法?【英文标题】:algorithm for the 0-1 Knapsack with 2 sacks? 【发布时间】:2015-03-19 02:43:09 【问题描述】:

正式地说,我们有 2 个容量为 c1 和 c2 的麻袋。有 N 个项目,利润为 pi,权重为 wi。与 0-1 背包问题一样,我们需要用这些项目填充 c1 和 c2,以使整体利润最大化。假设 pi 和 wi 是正整数!

对于2个背包问题,下面的递归关系成立吗?

DP[I][J][K] 是我们可以从前 i 件物品中获得的最大利润,因此在背包 #1 中使用正好 j 的重量,在背包 #2 中使用正好 k 的重量

DP[i][j][k] = max(DP[i-1][j][k], DP[i][j-1][k], DP[i][j][ k-1], DP[i][j-W[j]][k] + C[i], DP[i][j][k-W[k]] + C[i])

【问题讨论】:

I, J, K 的索引是什么?它们与i,j,k 有什么关系? DP 是什么? C 是什么? 【参考方案1】:

假设 C[i] 和 W[i] 分别是物品的价值和重量。

鉴于 j-W[i] >0, k-W[i] > 0(为了方便编写公式。我们仍然可以通过添加两行来编写没有这个假设的公式),等式应该是

DP[i][j][k] = max(DP[i-1][j][k], DP[i-1][j-W[i]][k]+C[i], DP[i-1][j][k-W[i]]+C[i])

【讨论】:

问题不是重写方程,而是让我知道下面是否有错误? DP[i][j][k] = max(DP[i-1][j][k], DP[i][j-1][k], DP[i][j][k-1 ], DP[i][j-W[j]][k] + C[i], DP[i][j][k-W[k]] + C[i]) 您的方程式很可能是错误的。请查看en.wikipedia.org/wiki/Knapsack_problem 以了解如何推导出一个背包的 0/1 背包问题的递归方程。一旦你理解了这个基础问题的递推方程的制作原理,你就可以推导出2个背包的背包问题的正确方程。 应该有 3 种不同的情况:(1)物品 i 没有放入两个背包,(2)物品 i 放入背包 1 和(3)物品 i 放入背包 2。所以应该有3种情况。我们以情况(3)为例,情况(3)的值应该是 DP[i-1][j][k-W[i]] + C[i] 因为背包 2 的容量减少了 W[i] 并且值增加 c[i]。注意:项目 i 被考虑,因此它应该类似于 "DP[i-1]....." 这就是你的方程看起来错误的原因。

以上是关于2袋0-1背包的算法?的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包的贪心算法

算法设计之0-1背包问题

优化算法系列-模拟退火算法——0-1背包问题

算法贪心算法(0-1背包问题)

0/1背包-递归算法

背包问题(贪心算法)