Let V[i , j ] be the value obtained by filling a knappack of size j with
items taken from the first i items {u1, . . . , ui} in an optimal way.
The recurrence relation
0 if i = 0 or j = 0
V[i , j ] = V[i ? 1, j ] if j < Si
max{V[i ? 1, j ],V[i ? 1, j ? Si ] + Vi} if i > 0 and j >= Si
由上面的启发产生以下解法
1.空间复杂度为N*C的解法
Knapsack
1. for i 0 to n do V[i , 0] 0
2. for j 0 to C do V[0, j ] 0
3. for i 1 to n
4. for j 1 to C
5. V[i , j ] V[i ? 1, j ]
6. if si j then V[i , j ] max{V[i , j ],V[i ? 1, j ? si ] + vi}
7. end for
8. end for
9. return V[n, C]
2.空间复杂度为C的解法,此解法是对上面解法的优化,降低了空间复杂度,但时间复杂度已经不能够简化
for i=1..N
for c=C..0
f[c] = max{f[c], f[c-s] + v}
对容量倒序是为了保证 f[c-s] 是第N-1次循环的结果,
其原理和解法1是完全一样的