编辑代码

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

//水果信息结构体
typedef struct {
    const char *name; //水果名
    double weight;   //水果重量
    double value;   //价值
    double valueKg;
}Fruit;

// 按水果价值降序排序
int des(const void *a, const void *b) {
    Fruit *fruitA = (Fruit *)a;
    Fruit *fruitB = (Fruit *)b;
    if (fruitA->valueKg > fruitB->valueKg) 
        return -1;
    if (fruitA->valueKg < fruitB->valueKg) 
        return 1;
    return 0;
}

//装包
void bag(Fruit fruits[], int size, double capacity) {
    double total_value = 0.0;
    printf("装水果策略如下:\n");

    for (int i = 0; i < size; i++) {
        if (capacity == 0) break;

        // 可以完全装入的情况
        if (fruits[i].weight <= capacity) {
            capacity -= fruits[i].weight;
            total_value += fruits[i].value;
            printf("%s: %.2f kg\n", fruits[i].name, fruits[i].weight);
        } else {
            // 只能装入部分的情况
            double part = capacity / fruits[i].weight;
            total_value += fruits[i].value * part;
            printf("%s: %.2f kg\n", fruits[i].name, capacity);
            capacity = 0; // 背包已满
        }
    }

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

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

    // 单位价值
    for (int i = 0; i < size; i++) {
        fruits[i].valueKg = fruits[i].value / fruits[i].weight;
    }

    // 排序
    qsort(fruits, size, sizeof(Fruit), des);

    // 背包容量
    double capacity = 20;

    // 装入背包
    bag(fruits, size, capacity);

    return 0;
}