01背包笔记

36 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

例题 洛谷P2392 P1048 二维数组图解

二维数组 01背包

for(i=1;i<=物品个数;i++) //行表示物品
{
    for(j=1;j<=背包容量;j++) //列表示背包容量
    {
        if(物品容量<=j) //装的下
        {
            k = 当前物品价值 + dp[i-1][j-当前物品容量];
            dp[i][j] = max(k,dp[i-1][j]);//比较放和不放哪个价值更高
        }
        else //装不下
        {
            dp[i][j] = dp[i-1][j]; //装i个物品的价值跟装i-1个物品的价值一样
        }
    }
}
//答案为dp[物品个数][背包容量]

空间优化 一维数组

注意:内层循环要逆序来更新 否则 dp[j-当前物品价值] 会先更新成装i个物品的 这样就导致后面的出错

    for(i=1;i<=物品个数;i++) //行表示物品
    {
        for(j=背包容量;j>=物品容量;j--) //列表示背包容量(大于等于物品价值防止索引越界)
    {
        if(当前物品容量<=j) //装的下
        {
            k = 当前物品价值 + dp[j-当前物品容量];
            dp[j] = max(k,dp[j]);
        }
        else //装不下(价值跟装i-1个物品一样,相当于不更新)
        {

        }
    }
}
//答案为dp[背包容量]