请用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-03-07 08:49:48 浏览: 24
以下是使用动态规划思路实现的 C 代码,可以求解背包问题并输出最大价值以及各物品装入背包的量。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000
#define MAXM 10000
int n, m;
int w[MAXN], p[MAXN];
double f[MAXM], x[MAXN];
void zero_one_pack(int weight, int value)
{
int i;
for (i = m; i >= weight; i--) {
if (f[i - weight] + value > f[i]) {
f[i] = f[i - weight] + value;
}
}
}
void complete_pack(int weight, int value)
{
int i;
for (i = weight; i <= m; i++) {
if (f[i - weight] + value > f[i]) {
f[i] = f[i - weight] + value;
}
}
}
void multiple_pack(int weight, int value, int amount)
{
if (weight * amount >= m) {
complete_pack(weight, value);
return;
}
int k = 1;
while (k < amount) {
zero_one_pack(k * weight, k * value);
amount -= k;
k *= 2;
}
zero_one_pack(amount * weight, amount * value);
}
int main()
{
int i;
scanf("%d %d", &m, &n);
for (i = 1; i <= n; i++) {
scanf("%d", &w[i]);
}
for (i = 1; i <= n; i++) {
scanf("%d", &p[i]);
}
memset(f, 0, sizeof f);
for (i = 1; i <= n; i++) {
multiple_pack(w[i], p[i], 1);
}
printf("%.2lf\n", f[m]);
memset(x, 0, sizeof x);
for (i = n; i >= 1; i--) {
if (w[i] * 1.0 > m) {
continue;
}
if (w[i] * 1.0 * p[i] >= f[m] * 100) {
x[i] = m * 1.0 / w[i];
break;
}
x[i] = 1;
m -= w[i];
}
for (i = 1; i <= n; i++) {
printf("%.2lf ", x[i]);
}
printf("\n");
return 0;
}
```
注意代码中的输出格式,需要保留小数点后两位并按照四舍五入进行处理。