编辑代码

#include <stdio.h>

#define FRUIT_COUNT 4
#define MAX_WEIGHT 20

// 定义每种水果的重量和价值
int fruits[][2] = {
    {15, 300},   // 苹果
    {18, 180},   // 香蕉
    {10, 150},   // 橘子
    {9, 270}     // 猕猴桃
};

int max(int a, int b) {
    return (a > b) ? a : b;
}

void printStrategy(int dp[][MAX_WEIGHT + 1], int weight, int n) {
    if (weight <= 0 || n <= 0) {
        return;
    }
    
    if (dp[n][weight] == dp[n - 1][weight - fruits[n - 1][0]] + fruits[n - 1][1]) {
        printStrategy(dp, weight - fruits[n - 1][0], n - 1);
        printf("装入水果%d:重量%dkg,价值%d元\n", n, fruits[n - 1][0], fruits[n - 1][1]);
    } else {
        printStrategy(dp, weight, n - 1);
    }
}

int main() {
    int dp[FRUIT_COUNT + 1][MAX_WEIGHT + 1] = {0};
    
    // 动态规划计算最大价值
    for (int i = 1; i <= FRUIT_COUNT; i++) {
        for (int j = 1; j <= MAX_WEIGHT; j++) {
            if (j >= fruits[i - 1][0]) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - fruits[i - 1][0]] + fruits[i - 1][1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    
    printf("装水果的策略:\n");
    printStrategy(dp, MAX_WEIGHT, FRUIT_COUNT);
    
    return 0;
}