[英]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.