一、01背包
动态规划的要点是:列出状态转移方程,也就是当前阶段的状态是由上一阶段状态和决策的结果。 记录下所有阶段状态的结果,且必须满足最优化原理的无后效性。
附主要代码:
for(int i=1;i<=M;i++){
for(int j=0;j<=N;j++){
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
else
dp[i][j]=dp[i-1][j]
}
}
可优化空间复杂度:
当计算到第i个背包时,发现当前阶段最优状态是由 dp[i-1][0.....N]决定的。
如果从大到小,即从承受最大重量V到0,我们用dp[v]和dp[v-w[i]]同样可以表示第i-1件物品的结果。
附代码:
for(int i=1;i<=M;i++){
for(int j=v;j>=w[i];j++){
dp[j]=max(dp[j-w[i]]+v[i],dp[j])
}
}