编辑代码

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

typedef struct {
    char name[10];
    int weight;
    int value;
} Item;

typedef struct {
    char name[10];
    float totalValue;
    int totalWeight;
    char fruits[4][10];
    int fruitsWeight[4];
} Contestant;

void knapsack(Item items[], int n, int W, Contestant* contestant) {
    int i, j;

    // 对物品按单位价值进行排序
    for (i = 0; i < n; i++) {
        for (j = i + 1; j < n; j++) {
            if ((float)items[i].value / items[i].weight < (float)items[j].value / items[j].weight) {
                Item temp = items[i];
                items[i] = items[j];
                items[j] = temp;
            }
        }
    }

    // 选择物品
    for (i = 0; i < n; i++) {
        if (items[i].weight <= W) {
            strcpy(contestant->fruits[i], items[i].name);
            contestant->fruitsWeight[i] = items[i].weight;
            W = W - items[i].weight;
            contestant->totalWeight += items[i].weight;
            contestant->totalValue += items[i].value;
        } else {
            strcpy(contestant->fruits[i], items[i].name);
            contestant->fruitsWeight[i] = W;
            contestant->totalWeight += W;
            contestant->totalValue += ((double)W / items[i].weight) * items[i].value;
            break;
        }
    }
}

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

    Contestant contestants[3] = {
        {"熊猫", 0.0, 0, {}, {}},
        {"山羊", 0.0, 0, {}, {}},
        {"梅花鹿", 0.0, 0, {}, {}}
    };

    for (int i = 0; i < 3; i++) {
        knapsack(items, 4, 20, &contestants[i]);
    }

    Contestant* winner = &contestants[0];
    for (int i = 1; i < 3; i++) {
        if (contestants[i].totalValue > winner->totalValue) {
            winner = &contestants[i];
        }
    }

    printf("获奖者是:%s\n", winner->name);
    printf("装入的水果是:\n");
    for (int i = 0; i < 4 && winner->fruits[i][0] != '\0'; i++) {
        printf("%s,重量:%d 千克\n", winner->fruits[i], winner->fruitsWeight[i]);
    }
    printf("实现的最大价值是:%.2f 元\n", winner->totalValue);
    printf("装入的总重量是:%d 千克", winner->totalWeight);

    return 0;
}