一个常数优化前面的伪代码中有for v=V..1,可以将这个循环的下限进行改进。
由于只需要最后dp[v]的值,倒推前一个物品,其实只要知道dp[v-w[n]]即可。以此类推,对以
第j个背包,其实只需要知道sumc[i->n](第i物品到最后一个物品的消耗和,因为前面的对结果没有影响)即可,即代码中的
1 for i -> 1 to N
2 do for v -> V to 0
3 do
可以改成:
1 for i -> 1 to n
2 do bound -> max(dp[V - sumc[i->n]], c[i]) // 《背包九讲》中这里笔误写错了。
3 for v -> V to bound
4 do
这对于V比较大时是有用的。
----- 摘自《背包问题九讲v1.1》
一个常数优化前面的伪代码中有for v=V..1,可以将这个循环的下限进行改进。由于只需要最后dp[v]的值,倒推前一个物品,其实只要知道dp[v-w[n]]即可。以此类推,对以第j个背包,其实只需要知道sumc[i->n](第i物品到最后一个物品的消耗和,因为前面的对结果没有影响)即可,即代码中的1 for i -> 1 to N2 do for v -> V to 03