用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 13:26:40 浏览: 83
以下是部分背包问题的C语言代码:
```c
#include <stdio.h>
#define MAX_N 1000
typedef struct {
double w; // 物品重量
double v; // 物品价值
double r; // 单位重量的价值
int id; // 物品编号
} Item;
Item items[MAX_N]; // 物品数组
int cmp(const void *a, const void *b) { // 按单位重量的价值降序排序
Item *x = (Item *)a;
Item *y = (Item *)b;
return (y->r - x->r) > 0 ? 1 : -1;
}
int main() {
int n, c, i;
double tw = 0.0, tv = 0.0; // 已装入背包的物品重量和价值
scanf("%d %d", &n, &c);
for (i = 0; i < n; i++) {
scanf("%lf %lf", &items[i].w, &items[i].v);
items[i].r = items[i].v / items[i].w; // 计算单位重量的价值
items[i].id = i;
}
qsort(items, n, sizeof(Item), cmp); // 排序
for (i = 0; i < n && tw + items[i].w <= c; i++) { // 贪心选择物品
printf("%d: 1.0\n", items[i].id);
tw += items[i].w;
tv += items[i].v;
}
if (i < n) {
printf("%d: %.2lf\n", items[i].id, (c - tw) / items[i].w); // 装入物品的一部分
tv += items[i].v * (c - tw) / items[i].w;
i++;
for (; i < n; i++) {
printf("%d: 0.0\n", items[i].id); // 不装入物品
}
}
printf("总重量=%.2lf 总价值=%.2lf\n", tw + (c - tw) / items[i - 1].w * items[i - 1].w, tv);
return 0;
}
```
输入格式为:
```
N C
w1 v1
w2 v2
...
wn vn
```
输出格式为:
```
物品编号: 装入程度
物品编号: 装入程度
...
总重量=... 总价值=...
```
其中,装入程度为1.0表示全部装入,为0.0表示全部不装入,为一个小数表示部分装入的比例。
阅读全文