如何用C++编写一个实现0/1背包问题的完整算法代码? int backPack(int m,vector<int> &A) { }
时间: 2024-11-15 22:26:23 浏览: 56
0/1背包问题是一个经典的动态规划问题,它可以用于决定在给定物品价值和重量限制下,选择哪些物品放入背包能够获得最大价值。这里是一个使用C++编写的简单0/1背包问题解决方案:
```cpp
#include <vector>
int backPack(int capacity, const std::vector<int>& values, const std::vector<int>& weights) {
int n = values.size(); // 物品数量
// 创建一个二维数组dp,其中dp[i][j]表示前i个物品中选取总重量不超过j的最大价值
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(capacity + 1, 0));
for (size_t i = 1; i <= n; ++i) {
for (int j = 1; j <= capacity; ++j) {
if (weights[i - 1] <= j) { // 如果当前物品能装进背包
dp[i][j] = std::max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]); // 更新状态
}
else {
dp[i][j] = dp[i - 1][j]; // 如果不能,就不选这个物品,保持之前的最优解
}
}
}
return dp[n][capacity]; // 返回背包容量为capacity时的最大价值
}
// 示例用法
int main() {
int m = 5; // 背包容量
std::vector<int> A = {60, 100, 120}; // 物品的价值
std::vector<int> B = {10, 20, 30}; // 物品的重量
int result = backPack(m, A, B);
std::cout << "Max value with a weight limit of " << m << ": " << result << std::endl;
return 0;
}
```
在这个代码里,`backPack`函数接受两个参数:背包的容量`capacity`以及物品的价值和重量的两个向量。通过遍历所有可能的物品组合并更新动态规划表`dp`,最终得到背包中最大价值。
阅读全文