编辑代码

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char name[20];
    double totalWeight;
    double totalValue;
} Item;

int compare(const void *a, const void *b) {
    Item *itemA = (Item *)a;
    Item *itemB = (Item *)b;
    double unitPriceA = itemA->totalValue / itemA->totalWeight;
    double unitPriceB = itemB->totalValue / itemB->totalWeight;
    if (unitPriceA > unitPriceB) {
        return -1;
    } else if (unitPriceA < unitPriceB) {
        return 1;
    }
    return 0;
}

void packBean(int packCapacity, Item *items, int numItems) {
    qsort(items, numItems, sizeof(Item), compare); // 按照单价从高到低排序

    double leftPackCapacity = packCapacity;
    double maxValue = 0;

    printf("装了如下物品:\n");
    for (int i = 0; i < numItems; ++i) {
        if (leftPackCapacity > items[i].totalWeight) {
            leftPackCapacity -= items[i].totalWeight;
            maxValue += items[i].totalValue;
            printf("%s %.2f\n", items[i].name, items[i].totalWeight);
        } else {
            double unitPrice = items[i].totalValue / items[i].totalWeight;
            double packWeight = leftPackCapacity;
            double packValue = packWeight * unitPrice;
            maxValue += packValue;
            printf("%s %.2f\n", items[i].name, packWeight);
            break;
        }
    }

    printf("总价值:%.2f\n", maxValue);
}

int main() {
    Item items[] = {
        {"苹果", 15, 300},
        {"香蕉", 18, 180},
        {"橘子", 10, 150},
        {"猕猴桃", 9, 270}
    };
    int numItems = sizeof(items) / sizeof(items[0]);

    packBean(20, items, numItems);

    return 0;
}