有N个物品,每个物品的重量是wi ,每个物品的价值是vi 。 求解当背包容量为W时,能获得的最大价值,并输出获得最大价值时每种物品是否在背包内 数据范围 0 < n <= 30 重量、价值、背包容量均为正整数第二行N个数,依次表示各个物品的是否放在背包里(0表示不放,1表示放),如果有多种方案,取字典序最小的。生成代码C++
时间: 2024-02-05 17:14:18 浏览: 44
0-1背包问题需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
5星 · 资源好评率100%
以下是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 35;
int n, W;
int w[N], v[N];
int f[N][N*N]; // f[i][j] 表示前i个物品,背包容量为j时的最大价值
int st[N][N*N]; // st[i][j] 表示前i个物品,背包容量为j时是否放置了第i个物品
int main()
{
cin >> n >> W;
for (int i = 1; i <= n; i ++ ) cin >> w[i] >> v[i];
memset(f, -0x3f, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= W; j ++ )
for (int k = 0; k <= j; k ++ )
if (f[i - 1][j - k] + v[i] > f[i][j])
{
f[i][j] = f[i - 1][j - k] + v[i];
st[i][j] = k;
}
cout << f[n][W] << endl;
for (int i = n, j = W; i; i -- )
{
if (st[i][j]) cout << i << ' ';
j -= st[i][j];
}
return 0;
}
```
时间复杂度:$O(nW^2)$
阅读全文