Algorithm 重复背包算法

Algorithm 重复背包算法,algorithm,dynamic-programming,pseudocode,knapsack-problem,Algorithm,Dynamic Programming,Pseudocode,Knapsack Problem,我正试图为背包算法设计一个伪代码,其中单个项目可以被多次选择。经典算法是 OPT(i, w) = max(OPT(i-1, w) or vi + OPT(i-1, w-wi)) 为了满足要求,我将其修改为 k=1; max = maximum(OPT(i-1, w)) while(OPT(i-1, w - k*wi) > 0) { maximum = max(maximum, k*vi + OPT(i-1, w - k*wi)) k++ } OPT(i, w) = maximum

我正试图为背包算法设计一个伪代码,其中单个项目可以被多次选择。经典算法是

OPT(i, w) = max(OPT(i-1, w) or vi + OPT(i-1, w-wi))
为了满足要求,我将其修改为

k=1;
max = maximum(OPT(i-1, w))
while(OPT(i-1, w - k*wi) > 0) {
  maximum = max(maximum, k*vi + OPT(i-1, w - k*wi))
  k++
}
OPT(i, w) = maximum
这似乎是一个合适的解决方案吗?还是存在更好的解决方案? 如果需要其他信息,请告诉我。
Rest all保持不变,vi表示第i个元素的值,wi表示第i个元素的权重。

如果您希望能够选择多个项目,则只需在选择元素时更改递归:

OPT(i, w) = max(OPT(i-1, w) or vi + OPT(i, w-wi))
                     ^                   ^
          removed the element      not removing the element
这个想法是,您允许在下一次迭代中读取它。您可以添加任意数量的元素,并且在“选择”使用停止递归公式中的第一个条件时停止添加


递归仍然不是无限的,因为您必须停止一次
w,基于算法DVP,重复背包的解决方案如下:

K(0)=0
for w=1 to W:
    K(w) = max{K(w - w_i) + v_i, w_i < w}
return K(W)
K(0)=0
对于w=1到w:
K(w)=max{K(w-w_i)+v_i,w_i
这里,W是容量;w_i是第i项的重量;v_i是第i项的值;K(w)是容量为w的背包可达到的最大值


不过,您的解决方案看起来像是0-1背包。

有没有可能,我们可以将其简化为1D输出的问题?我不明白您所说的“1D输出”是什么意思。
OPT
的输出是一个布尔值/因为我们使用i和W作为变量,代码的空间复杂度是O(nW)。我们能不能把它减少到O(n)?@LearningToCode空间的复杂度可以是O(W),因为在每一点上,你都需要当前列和前一列,所以它可以在O(W)空间中完成,时间为O(nW)。