#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *name;
double weight;
double value;
double valuePerKg;
} Fruit;
int compare(const void *a, const void *b) {
Fruit *fruitA = (Fruit *)a;
Fruit *fruitB = (Fruit *)b;
return fruitB->valuePerKg - fruitA->valuePerKg > 0 ? 1 : -1;
}
void fractionalKnapsack(Fruit fruits[], int n, double capacity) {
for (int i = 0; i < n; i++) {
fruits[i].valuePerKg = fruits[i].value / fruits[i].weight;
}
qsort(fruits, n, sizeof(Fruit), compare);
double totalValue = 0;
for (int i = 0; i < n; i++) {
if (capacity > 0 && fruits[i].weight <= capacity) {
capacity -= fruits[i].weight;
totalValue += fruits[i].value;
printf("装入全部 %s (%.2f kg, %.2f 元)\n", fruits[i].name, fruits[i].weight, fruits[i].value);
} else {
totalValue += fruits[i].valuePerKg * capacity;
printf("装入部分 %s (%.2f kg, %.2f 元)\n", fruits[i].name, capacity, fruits[i].valuePerKg * capacity);
break;
}
}
printf("总价值: %.2f 元\n", totalValue);
}
int main() {
Fruit fruits[] = {
{"苹果", 15, 300},
{"香蕉", 18, 180},
{"橘子", 10, 150},
{"猕猴桃", 9, 270}
};
int n = sizeof(fruits) / sizeof(fruits[0]);
double capacity = 20;
fractionalKnapsack(fruits, n, capacity);
return 0;
}