有一个载重为10的背包,现有4类物品,每类物品的重量分别为 (Wo,WI,W2,W3)=(2,3,4,7) 它们的价值分别为(P0,P1,P2,P3)=(1,3,5,9)。试问如何装载能够使背包容纳物品的价值最大。用C++来编写一个程序
时间: 2024-12-19 09:20:00 浏览: 12
这是一个经典的动态规划问题,可以使用0-1背包算法来解决。在0-1背包问题中,我们需要确定每个物品是否放入背包,并找到最优解以最大化背包内的总价值。以下是使用C++编写的简单程序:
```cpp
#include <iostream>
#include <vector>
int knapSack(int W, std::vector<int>& wt, std::vector<int>& val, int n) {
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(W + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int w = 1; w <= W; ++w) {
if (wt[i - 1][w], dp[i - 1][w - wt[i - 1]] + val[i - 1]);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][W];
}
int main() {
int capacity = 10;
std::vector<int> weights = {2, 3, 4, 7};
std::vector<int> values = {1, 3, 5, 9};
int num_items = weights.size();
int max_value = knapSack(capacity, weights, values, num_items);
std::cout << "Maximize value in the backpack: " << max_value << std::endl;
// 输出最优物品选择,这需要回溯dp数组并记录选择过程,这里简化了代码,实际项目中需增加回溯部分
std::cout << "Items included: ";
for (int i = num_items; i > 0 && dp[num_items][capacity] != dp[num_items - 1][capacity]; --i) {
if (dp[num_items][capacity] == dp[num_items - 1][capacity - weights[i - 1]] + values[i - 1]) {
std::cout << "(" << weights[i - 1] << "," << values[i - 1] << ") ";
capacity -= weights[i - 1];
}
}
std::cout << std::endl;
return 0;
}
```
这个程序首先初始化一个二维动态规划数组`dp`,然后通过两层循环遍历所有可能的组合,计算出每个状态下的最大价值。主函数中输出最大价值以及对应的物品选择。
请注意,此代码仅用于演示,实际应用中可能需要添加更多的错误检查和优化处理。
阅读全文