经典背包问题:用动态规划求最大价值及所有选择方案(附C++代码)
这是一个经典的背包问题,可以使用动态规划来求解。 定义一个二维数组dp,其中dp[i][j]表示前i个物品放入容量为j的背包中能够获得的最大总价值。 初始化dp数组的第一列和第一行都为0。 对于第i个物品,有两种情况: 1. 不选取第i个物品:dp[i][j] = dp[i-1][j],表示前i-1个物品放入容量为j的背包中能够获得的最大总价值。 2. 选取第i个物品:dp[i][j] = dp[i-1][j-w[i]] + v[i],表示将第i个物品放入容量为j的背包中能够获得的最大总价值。 状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) 最终,dp[n][g]就是背包内物品的最大总价值。 然后,通过回溯的方式,找出所有的选择方案。从dp[n][g]开始向前遍历,如果dp[i][g] == dp[i-1][g],说明第i个物品没有被选取;如果dp[i][g] == dp[i-1][g-w[i]] + v[i],说明第i个物品被选取。递归回溯过程中,同时记录所有选择方案。 输出最大总价值和选择方案的数量,以及每个选择方案。 具体实现代码如下: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<vector<int>> result; void backtrack(vector<vector<int>>& dp, vector<int>& w, vector<int>& v, int i, int j, vector<int>& cur) { if (i == 0) { result.push_back(cur); return; } if (dp[i][j] == dp[i-1][j]) { backtrack(dp, w, v, i-1, j, cur); } if (j >= w[i]) { if (dp[i][j] == dp[i-1][j-w[i]] + v[i]) { cur.push_back(i); backtrack(dp, w, v, i-1, j-w[i], cur); cur.pop_back(); } } } int main() { int n, g; cin >> n >> g; vector<int> w(n+1); vector<int> v(n+1); for (int i = 1; i <= n; i++) { cin >> w[i]; } for (int i = 1; i <= n; i++) { cin >> v[i]; } vector<vector<int>> dp(n+1, vector<int>(g+1, 0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= g; j++) { if (j >= w[i]) { dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); } else { dp[i][j] = dp[i-1][j]; } } } cout << dp[n][g] << endl; vector<int> cur; backtrack(dp, w, v, n, g, cur); sort(result.begin(), result.end()); cout << result.size() << endl; for (auto& r : result) { for (int i = 0; i < r.size(); i++) { cout << r[i]; if (i != r.size() - 1) { cout << " "; } } cout << endl; } return 0; } ``` 时间复杂度分析: 动态规划部分的时间复杂度为O(n*g),回溯部分的时间复杂度取决于选择方案的数量,最坏情况下为O(2^n)。总体时间复杂度为O(n*g + 2^n)。 ######[AI写代码神器 | 1709点数解答 | 2024-06-09 15:51:05]
- 含不规则缺陷原材料的最优切割方案建模与损失率、利用率计算(DeepSeek | 2367点数解答 | 2025-05-10 23:47:30)278
- 超详细:JDK安装及Windows系统环境变量设置全攻略 (阿里通义 | 376点数解答 | 2024-03-06 17:27:29)367
- 高考毕业晚会难题:从学生能力值求最大默契程度的Python解法(字节豆包 | 487点数解答 | 2026-01-24 13:10:18)56
- 工程师必备:十大APP性能优化方案大揭秘(百度文心 | 300点数解答 | 2023-11-09 18:31:04)349
- Python 高效求解:让数列变身接龙数列最少需删多少数?(字节豆包 | 493点数解答 | 2025-12-13 10:25:59)75
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)69
- 无名杀1.11.0:三国杀“韬晦”技能代码详解,开发避坑指南! (百度文心 | 1168点数解答 | 2026-01-12 21:02:27)75
- 深入探究:n 位格雷码中编号 k 二进制串的求解算法与实现(DeepSeek | 726点数解答 | 2026-01-13 12:31:37)68
- 2 秒动画搞定!“好句子”如何稳停结束位置( | 456点数解答 | 2024-05-19 16:46:15)282
- PHP实训:从0到1搭建电商平台,收获技能与成长!(讯飞星火 | 674点数解答 | 2024-06-17 08:58:32)365
- PHP实训:搭建电商平台的实战之旅与收获反思 (讯飞星火 | 623点数解答 | 2024-06-17 08:59:26)349
- PHP 实训:从零打造电子商务平台,解锁开发全流程!(GPT | 1439点数解答 | 2024-06-17 09:00:18)306