动态规划解决0/1背包问题的C++代码,满足如下条件:输入格式: 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量w i ; 第3行是各物品的价值p i ,背包容量和物品重量都为整数。 输出格式: 第1行是所选物品的价值之和,以及重量之和; 第2行是各物品装入背包的量,即x i 值。
时间: 2024-03-01 19:49:50 浏览: 67
动态规划解决0-1背包问题(c++)
5星 · 资源好评率100%
以下是符合要求的动态规划解决0/1背包问题的C++代码:
```c++
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1010;
int f[N][N];
int w[N], p[N];
int n, m;
int main()
{
cin >> m >> n;
for (int i = 1; i <= n; i ++ ) cin >> w[i];
for (int i = 1; i <= n; i ++ ) cin >> p[i];
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= m; j ++ )
{
f[i][j] = f[i - 1][j];
if (j >= w[i])
f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + p[i]);
}
vector<int> res;
int j = m;
for (int i = n; i; i -- )
if (f[i][j] != f[i - 1][j])
{
res.push_back(i);
j -= w[i];
}
cout << f[n][m] << ' ' << j << endl;
for (int i = res.size() - 1; i >= 0; i -- ) cout << res[i] << ' ';
return 0;
}
```
该代码使用二维数组 `f[i][j]` 表示考虑前 `i` 件物品,背包容量为 `j` 时的最大价值。初始化时 `f[0][j] = 0`,考虑第 `i` 件物品时,若不装入,则 `f[i][j] = f[i - 1][j]`,若装入,则 `f[i][j] = f[i - 1][j - w[i]] + p[i]`。最终输出的是最大价值和背包的剩余容量,以及每个物品被选中的数量。
阅读全文