编辑代码

#include <stdio.h>

// 定义一个结构体来表示水果
typedef struct {
    char name[20];
    float weight;
    float value;
    float ratio; // 单位重量价值
} Fruit;

// 交换两个Fruit结构体的函数
void swap(Fruit *a, Fruit *b) {
    Fruit temp = *a;
    *a = *b;
    *b = temp;
}

// 根据单位重量价值对水果进行排序的函数(降序)
void sortFruits(Fruit fruits[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (fruits[j].ratio < fruits[j + 1].ratio) {
                swap(&fruits[j], &fruits[j + 1]);
            }
        }
    }
}

int main() {
    // 初始化水果
    Fruit fruits[4] = {
        {"苹果", 15, 300},
        {"香蕉", 18, 180},
        {"橘子", 10, 150},
        {"猕猴桃", 9, 270}
    };

    // 计算每种水果的单位重量价值
    for (int i = 0; i < 4; i++) {
        fruits[i].ratio = fruits[i].value / fruits[i].weight;
    }

    // 对水果进行排序
    sortFruits(fruits, 4);

    float maxWeight = 20; // 背包的最大承重
    float totalValue = 0; // 装入背包的水果的总价值

    printf("装入总价值最高为:\n");

    // 依次选取单位重量价值最高的水果装入背包
    for (int i = 0; i < 4; i++) {
        if (fruits[i].weight <= maxWeight) {
            // 如果可以装下整个水果,就全部装入
            maxWeight -= fruits[i].weight;
            totalValue += fruits[i].value;
            printf("装入 %s: %.2f kg\n", fruits[i].name, fruits[i].weight);
        } else {
            // 否则只装入部分
            totalValue += maxWeight * fruits[i].ratio;
            printf("装入 %s: %.2f kg\n", fruits[i].name, maxWeight);
            break; // 背包已满,退出循环
        }
    }

    printf("总价为: %.2f\n", totalValue);

    return 0;
}