c++编写程序实现: 1、<验证> 输入背包容量,物品数量、价值及重量,利用动态规划法解决0-1背包问题,要求输出装入物品的对应指示向量,并分析该算法性能。
时间: 2024-02-12 11:04:16 浏览: 71
好的,这是一个经典的0-1背包问题,我可以帮您解决。下面是程序实现及分析。
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void zeroOneKnapsack(int capacity, int n, vector<int>& value, vector<int>& weight) {
vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, 0)); // dp[i][j]表示前i个物品,容量为j时的最大价值
vector<int> selected(n, 0); // 选中的物品
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= capacity; j++) {
if (weight[i - 1] > j) { // 背包总容量小于当前物品重量
dp[i][j] = dp[i - 1][j];
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
}
}
}
int j = capacity;
for (int i = n; i >= 1; i--) {
if (dp[i][j] > dp[i - 1][j]) {
selected[i - 1] = 1;
j -= weight[i - 1];
}
}
cout << "Selected items: ";
for (int i = 0; i < n; i++) {
cout << selected[i] << " ";
}
cout << endl;
cout << "Max value: " << dp[n][capacity] << endl;
}
int main() {
int capacity, n;
vector<int> value, weight;
// 输入容量、物品数量、价值、重量
cin >> capacity >> n;
for (int i = 0; i < n; i++) {
int v, w;
cin >> v >> w;
value.push_back(v);
weight.push_back(w);
}
zeroOneKnapsack(capacity, n, value, weight);
return 0;
}
```
该算法的时间复杂度为$O(nW)$,其中$n$为物品数量,$W$为背包的总容量,空间复杂度为$O(nW)$。因此,当物品数量和背包容量较大时,算法的性能可能会受到影响。但是,该算法是一种非常实用和有效的算法,已经被广泛应用于实际生产中。
阅读全文