01背包问题的前提条件
每个物品只能选择一个;
物品必须按序进行决定,选或者不选;
dp[i][j]的含义
dp[i][j]表示当前可选物品为前i个物品,背包容量上限为j的条件下,能获得的最大价值;
状态转移算法(方程)
状态转移算法是指当可选物品范围增加到第i个物品时,当前条件下的dp[i][j]怎么计算?
(一)w[i]>j
表示当前第i个物品的容量大于所给的背包容量上限j,只能不选。
dp[i][j] = dp[i-1][j];
即:增加第i个可选物品时,容量为j的背包的最大价值等同于只有前(i-1)个可选物品时的最大容量!
(二)w[i]<=j
表示当前第i个物品的容量小于等于所给的背包容量上限j,可选可不选。
(1)不选,此时的背包最大价值:
dp[i][j] = dp[i-1][j]
与上一情况相同;
(2)选,此时背包首先装入第i个物品,价值增加v[i];同时背包还剩下容量j-w[i],这一剩余容量可以在前(i-1)个物品里选择,其最大价值为dp[i-1,j-w[i]]。因此此时的背包总价值
dp[i][j] = v[i]+dp[i-1][j-w[i]]
最终我们选取两种情况下价值最大的:
dp[i][j] = max{ dp[i-1][j]; v[i]+dp[i-1][j-w[i]] }