繁体   English   中英

为什么要在整数背包中使用Capacity-1?

[英]Why Capacity-1 in integer knapsack?

对于容量为C的背包,对于n个项目,其中第一个项目的大小为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)中。

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

我认为您必须对公式的设置有些困惑-特别是,您将装袋的容量与n-1个子问题混为一谈。 让我们重新定义一下。

  • P表示问题,由n项列表表示。
  • 此外,让Pk表示由原始问题的索引为1...k的项组成的子问题,其中1 <= k <= n 因此, Pn等于P
  • 对于索引i处的每个项目,让Vi表示该项目的值,而Si表示该项目的大小。
  • C为袋子的容量, C >= 0
  • M(Pk, C)表示容量为C Pk描述的问题的最优解。 M(Pk, C)返回解决方案中包含的项目列表(因此也返回最佳解决方案的值和袋子中的多余容量)。

对于每个项目,我们可以将其包含在最佳解决方案中,也可以不将其包含在最佳解决方案中。 显然,最佳解决方案是这两个选项中的任何一个都更可取。 唯一需要考虑的特殊情况是,所涉及的物品不能放入包中。 在这种情况下,我们必须排除它。

我们可以依靠递归为我们覆盖所有项目,因此不需要迭代。 因此所有:

M(Pk,C)= if(Sk> C)M(P(k-1),C)否则max(M(P(k-1),C),Vk + M(P(k-1), C-Sk))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM