编辑代码

#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;
}