用C语言编写1.给定N种物品和一个背包。物品i的重量是w[i],其价值为v[i],背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.在选择装入背包的物品时,对每种物品i只有2种选择:装入背包(=1)或不装入背包(=0)。不能将物品i装入背包多次,在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包。第一行输入两个整数0<N<=1000,0<C<108,N表示物品的数量,C表示背包的容量。 接下来N行,每行读入两个实数Wi,Vi,分别表示物品i的重量和其价值。输出N行,每行输出 "物品编号: 装入程度",按物品单位重量的价值降序输出。
时间: 2023-12-02 20:23:47 浏览: 24
这个问题可以用动态规划来解决。具体地,设f[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。则有以下递推关系式:
f[i][j] = max{f[i-1][j], f[i-1][j-w[i]]+v[i]},其中w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。
意思是对于第i个物品,我们可以选择将其放入背包中或者不放入背包中。如果选择放入背包中,那么此时背包的容量就会减少w[i],并且我们可以获得v[i]的价值。如果选择不放入背包中,那么此时背包的容量不变,我们也不会获得任何价值。
最终的答案就是f[N][C]。具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
double v;
} Node;
int cmp(const void *a, const void *b) {
Node *pa = (Node *)a;
Node *pb = (Node *)b;
return pb->v > pa->v ? 1 : -1;
}
int main() {
int n, c, i, j, k;
double w[1005], v[1005], f[1005][1000005];
Node nodes[1005];
// 读入数据
scanf("%d%d", &n, &c);
for (i = 1; i <= n; ++i) {
scanf("%lf%lf", &w[i], &v[i]);
nodes[i].id = i;
nodes[i].v = v[i] / w[i];
}
// 按单位重量价值降序排序
qsort(nodes + 1, n, sizeof(Node), cmp);
// 动态规划过程
for (i = 1; i <= n; ++i) {
for (j = 0; j <= c; ++j) {
if (j < w[nodes[i].id]) {
f[i][j] = f[i - 1][j];
} else {
f[i][j] = f[i - 1][j] > f[i - 1][j - w[nodes[i].id]] + v[nodes[i].id] ?
f[i - 1][j] : f[i - 1][j - w[nodes[i].id]] + v[nodes[i].id];
}
}
}
// 输出结果
for (i = 1; i <= n; ++i) {
printf("%d: %d\n", nodes[i].id, f[i][c] > f[i - 1][c] ? 1 : 0);
}
return 0;
}
```
其中,我们对节点进行了一次排序,按照单位重量价值降序排列,这样在输出的时候就可以按照降序输出了。