请给出c语言代码。现有n种物品和一个可承载M 重量的背包,n种物品的重量分别为(w 1 , w 2 , …, w n ),n种物品放入背包所获得的效益分别是(p 1 , p 2 , …, p n ) (p i >0),p i 和w i 均是正整数,若将物品i的一部分x i (0<=x i <=1)放入背包,则所获得的效益是p i x i ,问采用怎样的装包方法会使装入背包物品的总效益为最大? 输入格式: 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量w i ; 第3行是各物品的价值p i 。 输出格式: 第1行是所选物品的最大价值之和; 第2行是各物品装入背包的量x i 。要求保留小数点后两位,第三位按照四舍五入处理。 输入样例1: 20 3 18 15 10 25 24 15 输出样例1: 31.5 0.00 1.00 0.50 输入样例2: 100 10 13 2 10 50 1 28 37 32 30 46 129 238 370 457 192 116 235 97 140 184 输出样例2: 1538.43 1.00 1.00 1.00 1.00 1.00 0.00 0.65 0.00 0.00 0.00
时间: 2024-02-19 22:02:29 浏览: 169
以下是贪心算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 物品结构体
typedef struct {
int w; // 重量
int p; // 价值
double v; // 单位重量价值
} Item;
// 比较函数,按照单位重量价值从大到小排序
int cmp(const void *a, const void *b) {
Item *p1 = (Item *)a;
Item *p2 = (Item *)b;
if (p1->v < p2->v) {
return 1;
} else if (p1->v > p2->v) {
return -1;
} else {
return 0;
}
}
int main() {
int M, n;
scanf("%d%d", &M, &n);
Item items[n];
for (int i = 0; i < n; i++) {
scanf("%d", &items[i].w);
}
for (int i = 0; i < n; i++) {
scanf("%d", &items[i].p);
items[i].v = items[i].p * 1.0 / items[i].w;
}
// 按照单位重量价值从大到小排序
qsort(items, n, sizeof(Item), cmp);
double ans = 0; // 最大价值
double x[n]; // 每个物品放入背包的量
for (int i = 0; i < n; i++) {
x[i] = 0;
}
for (int i = 0; i < n; i++) {
if (M <= 0) {
break;
}
if (items[i].w <= M) {
// 将物品i全部放入背包中
x[i] = 1;
ans += items[i].p;
M -= items[i].w;
} else {
// 将物品i的一部分放入背包中
x[i] = M * 1.0 / items[i].w;
ans += items[i].p * x[i];
M = 0;
}
}
// 输出结果
printf("%.2f\n", ans);
for (int i = 0; i < n; i++) {
printf("%.2f ", x[i]);
}
return 0;
}
```
其中,比较函数用于按照单位重量价值从大到小排序。循环中,依次考虑每个物品,如果该物品的重量小于等于背包剩余容量,则将其全部放入背包中,否则将背包剩余容量全部放入背包中。最终的答案即为背包中物品的总效益。同时,对于每个物品,其放入背包的量x可以根据上述过程计算得到。
注意,输出小数时需要保留两位,并按照四舍五入处理。可以使用printf函数的%.2f格式实现。
阅读全文