01背包的一维优化
对01背包问题一维优化的思考
二维
for(int i = 1; i <= n; i++)
for(int j = 0; j <= m; j++) {
f[i][j] = f[i - 1][j];
if(j >= v[i]) f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
}
为什么可以一维优化?
先考虑二维的转移方程
f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i])
可以发现:
1.每次f第一维i的更新只依赖于i - 1,不会用到之前的值,所以可以考虑滚动数组,只用一维,直接覆盖即可
2.对于每次j的更新,只依赖于j和j - w[ i ],是 <= j的,那么可以改变j的更新方式,倒着来更新,这样保证了更新第i层的f[ j ]时,使用的是第i - 1层的f[ j - v[ i ] ]
一维优化
for(int i = 1; i <= n; i++)
for(int j = m; j >= v[i]; j--)
f[j] = max(f[j], f[j - v[i]] + w[i]);
浙公网安备 33010602011771号