#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
double weight;
double value;
} Item;
int compare(const void* left, const void* right) {
Item* leftItem = (Item*)left;
Item* rightItem = (Item*)right;
double leftUnitPrice = leftItem->value / leftItem->weight;
double rightUnitPrice = rightItem->value / rightItem->weight;
if (leftUnitPrice > rightUnitPrice) {
return -1;
} else if (leftUnitPrice == rightUnitPrice) {
return 0;
} else {
return 1;
}
}
void packFruits(double packCapacity, Item items[], int n) {
qsort(items, n, sizeof(Item), compare);
double leftPackCapacity = packCapacity;
for (int i = 0; i < n; i++) {
if (leftPackCapacity > items[i].weight) {
leftPackCapacity -= items[i].weight;
printf("装入物品:%s %.2fkg\n", items[i].name, items[i].weight);
} else {
double unitPrice = items[i].value / items[i].weight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
printf("装入物品:%s %.2fkg\n", items[i].name, packWeight);
leftPackCapacity = 0;
break;
}
}
}
int main() {
Item items[] = {
{"苹果", 15, 300},
{"香蕉", 18, 180},
{"橘子", 10, 150},
{"猕猴桃", 9, 270}
};
int n = sizeof(items) / sizeof(items[0]);
double packCapacity = 20;
printf("装了如下水果:\n");
packFruits(packCapacity, items, n);
double maxValue = 0;
double leftPackCapacity = packCapacity;
for (int i = 0; i < n; i++) {
if (leftPackCapacity > items[i].weight) {
maxValue += items[i].value;
leftPackCapacity -= items[i].weight;
} else {
double unitPrice = items[i].value / items[i].weight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
maxValue += packValue;
break;
}
}
printf("总价值:%.2f元\n", maxValue);
return 0;
}