对于01背包问题,动态规划的二维状态转移方程为:
dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - w(i)] + v[i])
物理意义:
前i个物品放入背包重量为j时的最大价值 = max(i不放入 (前i - 1 个物品放入背包,重量为j) 时的价值,i放入(前 i - 1 个物品放入背包,重量为 j - w(i)) 时的价值)
对于二维转移方程,顺序处理即可,但是若想做到空间优化,将二维状态转移方程变为一维状态转移方程:
dp[j] = max(dp[j],dp[j - w(i)] + v(i))
上式等式右边均为 i - 1时的状态,等式左边为 i 时的状态,此式表明:
dp[j] 既可以表示 dp[i][j], 又可以表示 dp[i - 1][j].
因此对于处理顺序就需要考虑一下了。
首先来看一下顺序操作会有什么后果:
对于顺序操作,显然 dp[j - w(i)] 会先于dp[j] 得到,而当计算dp[j]时,
dp[j] = max(dp[j],dp[j - w(i)] + v(i)) 中的dp[j - w(i)]此时已经不是 i - 1时的状态值了,而是 i 时的值,也就是发生了覆盖现象,因此,顺序操作是不可取的。