编辑代码

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

struct Item {
    char* name;
    float totalWeight;
    float totalValue;
};

struct PackedItem {
    char* name;
    float packedWeight;
};

void printItems(struct PackedItem* packedItems, int numItems) {
    for (int i = 0; i < numItems; i++) {
        printf("%s:%f\n", packedItems[i].name, packedItems[i].packedWeight);
    }
}

int compareGreaterItemUnitPrice(const void* left, const void* right) {
    float leftUnitPrice = ((struct Item*)left)->totalValue / ((struct Item*)left)->totalWeight;
    float rightUnitPrice = ((struct Item*)right)->totalValue / ((struct Item*)right)->totalWeight;
    return (leftUnitPrice > rightUnitPrice) ? -1 : 1;
}

void packItem(float packageWeight, struct Item* items, int numItems, struct PackedItem* packedItems, int* numPackedItems) {
    //按照从大到小顺序对items进行排序
    qsort(items, numItems, sizeof(struct Item), compareGreaterItemUnitPrice);

    float curWeight = 0.0;
    *numPackedItems = 0;

    //将豆子装入背包
    for(int i = 0; i < numItems; i++) {
        if (curWeight + items[i].totalWeight < packageWeight) {
            packedItems[*numPackedItems].name = items[i].name;
            packedItems[*numPackedItems].packedWeight = items[i].totalWeight;
            (*numPackedItems)++;
            curWeight += items[i].totalWeight;
        }
        else {
            packedItems[*numPackedItems].name = items[i].name;
            packedItems[*numPackedItems].packedWeight = packageWeight - curWeight;
            (*numPackedItems)++;
            break;
        }
    }
}

int main() {
    struct Item items[5];

    //初始化装包豆子
    items[0] = (struct Item){"soybean", 100, 100};
    items[1] = (struct Item){"mung bean", 30, 90};
    items[2] = (struct Item){"red bean", 60, 120};
    items[3] = (struct Item){"black bean", 20, 80};
    items[4] = (struct Item){"green bean", 50, 75};

    struct PackedItem packedItems[5];
    int numPackedItems;

    packItem(100, items, 5, packedItems, &numPackedItems);

    printItems(packedItems, numPackedItems);

    return 0;
}