找回密码
 立即注册
首页 资源区 代码 常用背包dp模板(未完待续)

常用背包dp模板(未完待续)

厥轧匠 2025-6-4 19:41:16
这里是作者的留言板

部分板子优化中...
你好哇,我是flypig114;
先说一句:本人仅在博客园发表博客,其他皆为盗版;
可能某些人能看出上面那句是什么意思,我也不多说了;
代码里有变量(只不过最近会改变量名使其更正规)数组的注释,so...不多废话,直接上正题!;
01背包

<blockquote>这里是题目AWA:
有\(N\)件物品和一个容量是\(M\)的背包。每件物品只能使用一次。第 \(i\)件物品的体积是\(w\),价值是\(v\)。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
输入格式
第一行两个整数,\(N\),\(M\),用空格隔开,分别表示物品数量和背包容积。接下来有 \(M\)行,每行两个整数\(wi\),\(vi\),用空格隔开,分别表示第\(i\)件物品的体积和价值。

输出格式
输出一个整数,表示最大价值。
数据范围
\(0 n >> m;    for (i = 1; i > w >> v;    }    //进行处理    for (i = 1; i = 0; j--)//从背包容量开始,保证每个物品都考虑过        {            if(j>=w)//判断是否可以放入            {                dp[j] = max(dp[i - 1][j - w] + v, dp[i - 1][j]);//判断是否放入,dp[i-1][j-w]+v更大则放入            }              else            {                dp[j] = dp[i - 1][j];//不放入            }                      }    //结束首战告捷    cout > n >> m;    for (i = 1; i > w >> v;    }    //重中之重(好像就这里改了)    for (i = 1; i = 0; j--)        {            if(j>=w)            {                dp[j] = max(dp[j - w] + v, dp[j]);            }        }    }       //可以输出了    cout  v >> w;  }  //完全背包启动!  for (i = 1; i > n;    for (i = 1; i > w >> v >> s;    }        //熟悉的流程    for (i = 1; i = v; j--) //倒序是为了防止重复计算        {            for (k = 1; k * v  n;    for (i = 1; i > v >> w >> s;    }    //拆分方式更加优美    for (i = 1; i = s * v; j--)        {            dp[j] = max(dp[j], dp[j - s * v] + s * w);            }        }        //我的回合!输出!    cout > n >> m;    for (i = 1; i > v >> w >> s;    }        for(i=1;i
您需要登录后才可以回帖 登录 | 立即注册