这是古老而着名的背包问题:Knapsack Problem
这里我有一个约束的背包问题
我有大小 W = 100000000 的背包和 N = 100 项目我为它编写了动态解决方案我的算法的复杂性是O(100000000*100)
这太大了在时间和空间都有一个条件,W ≤ 50000 or max 1≤ i ≤ n Vi ≤ 500.
如果我的背包尺寸超过50000我的物品最大值是有限的。
所以现在我想知道如何减少我的算法复杂度这个条件我认为背包问题取决于背包的大小和项目的数量,所以项目的价值如何改变我的算法的变化?
答案 0 :(得分:2)
而不是创建一个大小为W*n
的表格,其中每个条目D[x][i]
表示最佳值(最高),您可以使用第一个x
获得最多i
个权重使用第一个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矩阵最后一行的线性扫描完成。
通过单次扫描数据来检查所需的变体。