背包问题
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步