编辑代码

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

typedef struct {
    char *name;
    double weight;
    double value;
    double valuePerKg;
} Fruit;

// 比较函数,按单位重量价值降序排列
int compare(const void *a, const void *b) {
    Fruit *fruitA = (Fruit *)a;
    Fruit *fruitB = (Fruit *)b;
    return fruitB->valuePerKg - fruitA->valuePerKg > 0 ? 1 : -1;
}

// 分数背包问题求解
void fractionalKnapsack(Fruit fruits[], int n, double capacity) {
    // 计算每种水果的单位重量价值
    for (int i = 0; i < n; i++) {
        fruits[i].valuePerKg = fruits[i].value / fruits[i].weight;
    }

    // 按单位重量价值降序排列
    qsort(fruits, n, sizeof(Fruit), compare);

    double totalValue = 0;
    for (int i = 0; i < n; i++) {
        if (capacity > 0 && fruits[i].weight <= capacity) {
            // 如果背包还有空间,且当前水果可以完全装入
            capacity -= fruits[i].weight;
            totalValue += fruits[i].value;
            printf("装入全部 %s (%.2f kg, %.2f 元)\n", fruits[i].name, fruits[i].weight, fruits[i].value);
        } else {
            // 只装入部分水果
            totalValue += fruits[i].valuePerKg * capacity;
            printf("装入部分 %s (%.2f kg, %.2f 元)\n", fruits[i].name, capacity, fruits[i].valuePerKg * capacity);
            break;
        }
    }

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

// 主函数
int main() {
    Fruit fruits[] = {
        {"苹果", 15, 300},
        {"香蕉", 18, 180},
        {"橘子", 10, 150},
        {"猕猴桃", 9, 270}
    };
    int n = sizeof(fruits) / sizeof(fruits[0]);
    double capacity = 20;

    fractionalKnapsack(fruits, n, capacity);
    return 0;
}