输入背包容量,物品数量、价值及重量,利用动态规划法解决0-1背包问题,要求输出装入物品的对应指示向量,并分析该算法性能。c++
时间: 2023-09-28 08:10:59 浏览: 82
以下是使用动态规划算法解决0-1背包问题的C++代码,其中包括了输出装入物品的对应指示向量的实现:
```c++
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, w;
cin >> n >> w;
vector<int> v(n+1), c(n+1);
for(int i = 1; i <= n; i++) {
cin >> v[i] >> c[i];
}
vector<vector<int>> dp(n+1, vector<int>(w+1));
vector<vector<bool>> path(n+1, vector<bool>(w+1));
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= w; j++) {
if(c[i] <= j) {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-c[i]]+v[i]);
if(dp[i-1][j] < dp[i-1][j-c[i]]+v[i]) {
path[i][j] = true;
}
} else {
dp[i][j] = dp[i-1][j];
}
}
}
vector<int> res(n+1, 0);
int j = w;
for(int i = n; i >= 1; i--) {
if(path[i][j]) {
res[i] = 1;
j -= c[i];
}
}
cout << "The maximum value is: " << dp[n][w] << endl;
cout << "The selected items are: ";
for(int i = 1; i <= n; i++) {
if(res[i] == 1) {
cout << i << " ";
}
}
cout << endl;
return 0;
}
```
在上述代码中,我们使用了两个二维数组`dp`和`path`,其中`dp[i][j]`表示前i个物品放入容量为j的背包中所能获得的最大价值,`path[i][j]`表示第i个物品是否被放入背包中。首先,我们初始化`dp[0][j]`和`dp[i][0]`均为0,然后对于每个物品i,我们分别考虑是否将其放入背包中。若将其放入,则可以获得`dp[i-1][j-c[i]]+v[i]`的价值,其中`dp[i-1][j-c[i]]`为前i-1个物品放入容量为j-c[i]的背包中所能获得的最大价值,加上v[i]即为将第i个物品放入背包中所能获得的价值。若不将其放入,则直接继承`dp[i-1][j]`的价值即可。最终,我们需要输出最大价值以及被选中的物品编号。
该算法的时间复杂度为O(nw),空间复杂度也为O(nw)。由于需要使用二维数组进行存储,因此当n和w较大时,该算法可能会面临内存不足的问题。
阅读全文