2022-10-09 10:10阅读: 15评论: 0推荐: 0

背包问题

01背包

相关题目

int package01(const vector<vector<int>>& things,const int volume,const int n) {
vector<vector<int>> dp(n + 1, vector<int>(volume + 1, 0));
// dp[i][j]表示前i件物品体积不超过j的情况下的最大价值
for (int i = 1; i <= n; i++) {
int weight = things[i - 1][0], value = things[i - 1][1];
for (int j = 1; j <= volume; j++) {
// 如果足够放下,就比较放和不放哪个大
// 如果放了,就看当前价值加上剩下容量可以容纳的最大价值
if (j >= weight) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight] + value);
else dp[i][j] = dp[i - 1][j];
}
}
/*for (vector<int> nums : dp) {
for (int num : nums) cout << num << " ";
cout << endl;
}*/
return dp[n][volume];
}
int main() {
int n, volume;
cin >> n >> volume;
vector<vector<int>> things(n, vector<int>(2));
for (int i = 0; i < n; i++)
cin >> things[i][0] >> things[i][1];
cout<<package01(things, volume, n);
return 0;
}

空间优化为一维数组

int package01(const vector<vector<int>>& things,const int volume,const int n) {
vector<int> dp(volume, 0);
for (int i = 1; i <= n; i++)
for (int j = volume; j >= things[i - 1][0]; j--)
dp[j] = max(dp[j], dp[j - things[i - 1][0]] + things[i - 1][1]);
return dp[volume];
}

虽然还不是很理解,但知道了大概怎么用

完全背包

很神奇的是,就结果而言,完全背包压缩后的代码只需要把01背包压缩后的代码的内层遍历由反向改为正向即可

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16771168.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起