为什么在整数背包中容量为1?

时间:2015-07-08 14:22:53

标签: c++ c algorithm data-structures knapsack-problem

整数背包问题的动态编程解决方案, 对于容量为C的背包,对于n个项目,其中第i个项目的大小为Si和值Vi,为:

M(C)= max(M(C-1),M(C-Si)+ Vi),其中i从1变为n

这里M是一个数组。 M(C)表示容量C的背包的最大值。

M(C-1)在这种关系中有什么用?我的意思是解决方案应该是这样的:

M(C)= max(M(C-Si)+ Vi),其中i从1变为n

我认为M(C-1)涵盖的所有案例都包含在M(C)中。

如果我错了,请举个例子。

1 个答案:

答案 0 :(得分:0)

我认为你必须对公式设置有点困惑 - 具体来说,你已经将包的容量与n-1项的子问题混淆了。让我们重新定义一下。

  • P表示问题,由n项列表表示。
  • 此外,让Pk代表由原始问题1...k处的索引1 <= k <= n的项目组成的子问题。因此Pn相当于P
  • 对于索引i的每件商品,让Vi表示该商品的价值,Si表示该商品的尺寸。
  • C成为行李的容量C >= 0
  • M(Pk, C)表示Pk描述的问题的最优解决方案,其容量为CM(Pk, C)返回解决方案中包含的项目列表(因此也返回最佳解决方案的值和包中的多余容量)。

对于每个项目,我们可以将其包含在最佳解决方案中,或者不将其包含在最佳解决方案中。显然,最佳解决方案是这两种选择中的哪一种更可取。唯一需要考虑的角落案例是,如果有问题的物品不能放入包中。在这种情况下,我们必须排除它。

我们可以依靠递归来覆盖每个项目,因此不需要迭代。所以一起:

M(Pk,C)= if(Sk> C)M(P(k-1),C)else max(M(P(k-1),C),Vk + M( p(K-1),C-SK))