编辑代码

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

#define MAX_ITEMS 5
#define MAX_WEIGHT 100

// 定义豆子的结构体
struct Bean {
    char name[10]; // 豆子的名字
    int quantity;  // 豆子的总量
    int value;     // 豆子的价格
    double unitValue; // 单位价值
};

// 比较函数,用于按单位价值降序排序
int compare(const void *a, const void *b) {
    return ((struct Bean *)b)->unitValue - ((struct Bean *)a)->unitValue;
}

// 贪心算法求解背包问题
void knapsack(struct Bean beans[], int n, int capacity) {
    // 计算每种豆子的单位价值
    for (int i = 0; i < n; i++) {
        beans[i].unitValue = (double)beans[i].value / beans[i].quantity;
    }

    // 按单位价值降序排序
    qsort(beans, n, sizeof(struct Bean), compare);

    // 初始化背包当前总量和总价值
    int currentQuantity = 0;
    int totalValue = 0;

    // 遍历豆子,放入背包
    for (int i = 0; i < n; i++) {
        if (currentQuantity + beans[i].quantity <= capacity) {
            // 放入整个豆子
            currentQuantity += beans[i].quantity;
            totalValue += beans[i].value;
            printf("放 %d kg 的 %s 到包里\n", beans[i].quantity, beans[i].name);
        } else {
            // 放入部分豆子
            int remainingQuantity = capacity - currentQuantity;
            double fraction = (double)remainingQuantity / beans[i].quantity;
            currentQuantity = capacity;
            totalValue += fraction * beans[i].value;
            printf("放 %.2lf kg 的 %s 到包里\n", fraction * beans[i].quantity, beans[i].name);
        }
    }

    // 输出最终结果
    printf("总价值: %d\n", totalValue);
}

int main() {
    struct Bean beans[MAX_ITEMS] = {
        {"黄豆", 100, 100},
        {"绿豆", 30, 90},
        {"红豆", 20, 80},
        {"黑豆", 20, 80},
        {"青豆", 50, 75}
    };

    int capacity = MAX_WEIGHT;

    knapsack(beans, MAX_ITEMS, capacity);

    return 0;
}