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]);
posted @ 2022-11-16 01:09  Ngu1  阅读(35)  评论(0)    收藏  举报