【问题标题】:algorithm for the 0-1 Knapsack with 2 sacks?2袋0-1背包的算法?
【发布时间】: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 是什么?

标签: algorithm dynamic-programming knapsack-problem recurrence


【解决方案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]....." 这就是你的方程看起来错误的原因。
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多