#include <stdio.h>
#include <string.h>
typedef struct {
char name[10];
int weight;
int value;
} Item;
typedef struct {
char name[10];
float totalValue;
int totalWeight;
char fruits[4][10];
int fruitsWeight[4];
} Contestant;
void knapsack(Item items[], int n, int W, Contestant* contestant) {
int i, j;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if ((float)items[i].value / items[i].weight < (float)items[j].value / items[j].weight) {
Item temp = items[i];
items[i] = items[j];
items[j] = temp;
}
}
}
for (i = 0; i < n; i++) {
if (items[i].weight <= W) {
strcpy(contestant->fruits[i], items[i].name);
contestant->fruitsWeight[i] = items[i].weight;
W = W - items[i].weight;
contestant->totalWeight += items[i].weight;
contestant->totalValue += items[i].value;
} else {
strcpy(contestant->fruits[i], items[i].name);
contestant->fruitsWeight[i] = W;
contestant->totalWeight += W;
contestant->totalValue += ((double)W / items[i].weight) * items[i].value;
break;
}
}
}
int main() {
Item items[4] = {
{"苹果", 15, 300},
{"香蕉", 18, 180},
{"橘子", 10, 150},
{"猕猴桃", 9, 270}
};
Contestant contestants[3] = {
{"熊猫", 0.0, 0, {}, {}},
{"山羊", 0.0, 0, {}, {}},
{"梅花鹿", 0.0, 0, {}, {}}
};
for (int i = 0; i < 3; i++) {
knapsack(items, 4, 20, &contestants[i]);
}
Contestant* winner = &contestants[0];
for (int i = 1; i < 3; i++) {
if (contestants[i].totalValue > winner->totalValue) {
winner = &contestants[i];
}
}
printf("获奖者是:%s\n", winner->name);
printf("装入的水果是:\n");
for (int i = 0; i < 4 && winner->fruits[i][0] != '\0'; i++) {
printf("%s,重量:%d 千克\n", winner->fruits[i], winner->fruitsWeight[i]);
}
printf("实现的最大价值是:%.2f 元\n", winner->totalValue);
printf("装入的总重量是:%d 千克", winner->totalWeight);
return 0;
}