整数背包问题的动态编程解决方案, 对于容量为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)中。
如果我错了,请举个例子。
答案 0 :(得分:0)
我认为你必须对公式设置有点困惑 - 具体来说,你已经将包的容量与n-1项的子问题混淆了。让我们重新定义一下。
P
表示问题,由n
项列表表示。Pk
代表由原始问题1...k
处的索引1 <= k <= n
的项目组成的子问题。因此Pn
相当于P
。i
的每件商品,让Vi
表示该商品的价值,Si
表示该商品的尺寸。C
成为行李的容量C >= 0
M(Pk, C)
表示Pk
描述的问题的最优解决方案,其容量为C
。 M(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))强>