用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
时间: 2024-03-07 18:49:51 浏览: 105
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 1005
#define MAX_M 100005
typedef struct bag {
double w, p;
} Bag;
Bag bg[MAX_N];
double dp[MAX_M], x[MAX_N], w[MAX_N], p[MAX_N];
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", &w[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%lf", &p[i]);
}
for (int i = 1; i <= n; i++) {
bg[i].w = w[i];
bg[i].p = p[i] / w[i];
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = m; j >= bg[i].w; j--) {
dp[j] = max(dp[j - (int)bg[i].w] + bg[i].p, dp[j]);
}
}
printf("%.2lf ", dp[m]);
memset(x, 0, sizeof(x));
for (int i = 1; i <= n; i++) {
if (m >= w[i]) {
x[i] = 1;
m -= w[i];
} else {
x[i] = m / w[i];
m = 0;
break;
}
}
for (int i = 1; i <= n; i++) {
printf("%.2lf ", x[i]);
}
return 0;
}
```
阅读全文