动态规划-背包问题

动态规划问题最重要的便是状态转移方程;
01背包:dp[ i ][ j ] = max(dp[ i-1][ j ], dp[ i ][ j-cost[ i ] ] + value[ i ]);其中i为第几个物品,j为背包容量;
代码:

for(int i=1; i<=n; ++i)
{
    for(int j=cost[i]; j<=bag; ++j)
    {
        dp[i][j] = max(dp[i-1][j], dp[i][j-cost[i]] + value[i]);
    }
}

空间复杂度优化:使用滚动数组;
dp[ j ] = max(dp[j], dp[j - cost[ i ] ] + value[ i ]);
代码:
第二层循环从bag->cost[i],利用滚动数组的特性保证第i个物品最多只取一次。(详解看后面给的博客,里面有图)
若是从cost[i]->bag,那么便可以去多次,也就变成了完全背包。

for(int i=1; i<=n; ++i)
{
    for(int j=bag; j>=cost[i]; --j)
    {
        dp[j] = max(dp[j], dp[j-cost[i]] + value[i]);
    }
}

博客:
01背包:https://blog.csdn.net/xp731574722/article/details/70766804
完全背包与多重背包:https://blog.csdn.net/qq_38984851/article/details/81133840

你可能感兴趣的:(暑假集训复习篇)