c++编写代码实现输入背包容量,物品数量、价值及重量,利用动态规划法解决0-1背包问题,要求输出装入物品的对应指示向量,并分析该算法性能。
时间: 2023-12-26 14:04:33 浏览: 65
好的,以下是代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
vector<int> knapsack(int W, int n, vector<int>& wt, vector<int>& val) {
vector<vector<int>> dp(n+1, vector<int>(W+1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (wt[i-1] > j) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-wt[i-1]] + val[i-1]);
}
}
}
vector<int> res(n, 0);
int i = n, j = W;
while (i > 0 && j > 0) {
if (dp[i][j] == dp[i-1][j]) {
i--;
} else {
res[i-1] = 1;
j -= wt[i-1];
i--;
}
}
return res;
}
int main() {
int W, n;
cout << "请输入背包容量W:";
cin >> W;
cout << "请输入物品数量n:";
cin >> n;
vector<int> wt(n), val(n);
for (int i = 0; i < n; i++) {
cout << "请输入第" << i+1 << "个物品的价值和重量:";
cin >> val[i] >> wt[i];
}
vector<int> res = knapsack(W, n, wt, val);
cout << "装入物品的对应指示向量:";
for (int i = 0; i < n; i++) {
cout << res[i] << " ";
}
cout << endl;
return 0;
}
```
该算法的时间复杂度为 O(nW),其中 n 是物品数量,W 是背包容量。空间复杂度为 O(nW)。在实际应用中,当物品数量和背包容量非常大时,该算法的复杂度会变得非常高,需要进行优化或选择其他算法。
阅读全文