编辑代码

#include <stdio.h>

#define MAX_FRUITS 4
#define MAX_WEIGHT 20

typedef struct {
    char name[10];
    int weight;
    int value;
} Fruit;

void printStrategy(int dp[MAX_FRUITS + 1][MAX_WEIGHT + 1], Fruit fruits[MAX_FRUITS]);

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

    int dp[MAX_FRUITS + 1][MAX_WEIGHT + 1] = {0};

    for (int i = 1; i <= MAX_FRUITS; i++) {
        for (int j = 1; j <= MAX_WEIGHT; j++) {
            if (j < fruits[i - 1].weight) {
                dp[i][j] = dp[i - 1][j];
            } else {
                int value1 = dp[i - 1][j];
                int value2 = dp[i - 1][j - fruits[i - 1].weight] + fruits[i - 1].value;
                dp[i][j] = (value1 > value2) ? value1 : value2;
            }
        }
    }

    printf("装水果的策略如下:\n");
    printStrategy(dp, fruits);

    return 0;
}

void printStrategy(int dp[MAX_FRUITS + 1][MAX_WEIGHT + 1], Fruit fruits[MAX_FRUITS]) {
    int totalValue = dp[MAX_FRUITS][MAX_WEIGHT];
    int i = MAX_FRUITS;
    int j = MAX_WEIGHT;

    while (i > 0 && j > 0) {
        if (dp[i][j] != dp[i - 1][j]) {
            printf("装入%s\n", fruits[i - 1].name);
            j -= fruits[i - 1].weight;
        }
        i--;
    }

    printf("总重量:%d kg\n", MAX_WEIGHT - j);
    printf("总价值:%d 元\n", totalValue);
}