用C语言贪心法解决如下问题:现有n种物品和一个可承载M 重量的背包,n种物品的重量分别为(w1, w2, …, wn),n种物品放入背包所获得的效益分别是(p1, p2, …, pn) (pi>0),pi 和wi均是正整数,若将物品i的一部分xi (0<=xi<=1)放入背包,则所获得的效益是pixi,问采用怎样的装包方法会使装入背包物品的总效益为最大? 输入格式: 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量wi; 第3行是各物品的价值pi。 输出格式: 第1行是所选物品的最大价值之和; 第2行是各物品装入背包的量xi。要求保留小数点后两位,第三位按照四舍五入处理。 输入样例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-03-07 08:49:54 浏览: 101
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 1005
typedef struct bag {
double w, p, x;
} Bag;
Bag bg[MAX_N];
int cmp(const void *a, const void *b) {
Bag x = *(Bag *)a, y = *(Bag *)b;
return y.p / y.w - x.p / x.w > 0 ? 1 : -1;
}
double max(double a, double b) {
return a > b ? a : b;
}
int main() {
int m, n;
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; i++) {
scanf("%lf", &bg[i].w);
}
for (int i = 1; i <= n; i++) {
scanf("%lf", &bg[i].p);
bg[i].x = 0;
}
qsort(bg + 1, n + 1, sizeof(Bag), cmp);
double ans = 0;
for (int i = 1; i <= n; i++) {
if (m >= bg[i].w) {
bg[i].x = 1;
m -= bg[i].w;
ans += bg[i].p;
} else {
bg[i].x = m / bg[i].w;
m = 0;
ans += bg[i].p * bg[i].x;
break;
}
}
printf("%.2lf ", ans);
for (int i = 1; i <= n; i++) {
printf("%.2lf ", bg[i].x);
}
return 0;
}
```
阅读全文