c语言编写给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 实例为:n=5,c=10,w={2,2,6,5,4},v={6,3,5,4,6} 输入: 5 10 2 2 6 5 4 6 3 5 4 6 输出: 15 1 1 0 0 1
时间: 2023-12-19 18:05:14 浏览: 151
这是一个经典的背包问题,可以使用动态规划求解。具体方法如下:
1. 定义状态:设f[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。
2. 定义状态转移方程:对于第i个物品,有两种选择:放入背包中或不放入背包中。如果放入背包中,则背包剩余容量为j-w[i],此时总价值为f[i-1][j-w[i]]+v[i];如果不放入背包中,则总价值为f[i-1][j]。因此状态转移方程为:
f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i]) (j>=w[i])
3. 边界条件:当i=0或j=0时,背包中的物品价值为0。
4. 最终结果:f[n][C]即为所求的最大价值。
根据上述方法,可以编写如下代码解决问题:
```c
#include <stdio.h>
#define MAX_N 100
#define MAX_C 10000
int n, C;
int w[MAX_N], v[MAX_N];
int f[MAX_N][MAX_C];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
scanf("%d%d", &n, &C);
for (int i = 1; i <= n; i++) {
scanf("%d", &w[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= C; j++) {
if (j < w[i]) {
f[i][j] = f[i-1][j];
} else {
f[i][j] = max(f[i-1][j], f[i-1][j-w[i]] + v[i]);
}
}
}
printf("%d ", f[n][C]);
// 输出方案
int x[MAX_N] = {0};
int j = C;
for (int i = n; i > 0; i--) {
if (f[i][j] > f[i-1][j]) {
x[i-1] = 1;
j -= w[i];
}
}
for (int i = 0; i < n; i++) {
printf("%d ", x[i]);
}
return 0;
}
```
输出结果为15 1 1 0 0 1,表示最大价值为15,选择了第1、2、5个物品。其中,1表示选择该物品,0表示不选择。
阅读全文