在背包九讲中,作者提到过
for i ← 1 to N
for v ← V to Ci
中第二重循环的下限可以改进。它可以被优化为
for i ← 1 to N
for v ← V to max(V -sum(Ci~Cn), Ci)
可以这样理解:
我们需要的最终结果是dp[V],当dp[V]最后一次更新实在i=N时,此时根据转移公式,dp[V]=max(dp[V],dp[V-CN]+WN),其他的
dp[0~ V-CN]是不需要的,所以不需要再转移了。
由此倒推,当i=N-1时,需要计算dp[V-CN],而根据转移方程可知:
dp[V-CN]=max(dp[V-CN],dp[V-CN-CN-1]+WN-1),所以只要计算[V-CN-CN-1 ~ V]就可以了,也即V-sum(Ci ~ CN)
以此类推,可得v在转移过程中的下限是max(V -sum(Ci ~ CN), Ci);