带有一个额外约束的背包

Knapsack with one additional constraint

这是古老而著名的背包问题:Knapsack Problem
这里我有一个约束条件的背包问题。
我有大小为 W = 100000000N = 100 项的背包我为它编写了动态解决方案我的算法的复杂性是 O(100000000*100) 这在时间和 space 上都太大了,但是这里有一个条件 W ≤ 50000 or max 1≤ i ≤ n Vi ≤ 500. 所以如果我的背包尺寸超过 50000,我的物品的最大值是有限的。
所以现在我想知道如何在这种情况下减少我的算法的时间复杂性我认为背包问题取决于背包的大小和物品的数量所以物品的价值如何改变我的算法?

而不是创建大小 W*n 的 table,其中每个条目 D[x][i] 表示您最多可以使用 x 权重获得的最佳值(最高)第一个 i 项,使用 table,其中 D[x][i] 是达到 x 值所需的 最小权重 ,使用前 i 个元素:

D(0,i) = 0                i>0
D(x,0) = infinity         x > 0
D(x,i) = infinity         x<0 or i<0
D(x,i) = min{ D(x,i-1), D(x-value[i],i-1) + weight[i])

当你完成后,找到 max{ x | D(x,n) <= W) } - 这是你可以获得的最高值,最多使用 W 权重,并且通过 DP 最后一行的线性扫描完成矩阵.

检查您需要的变体是通过一次数据扫描完成的。