编辑代码

#include <stdio.h>
#include <string.h>

#define MAX_FRUIT_NAME_LENGTH 20
#define MAX_FRUITS 4
#define MAX_WEIGHT 20

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

void optimize_backpack(Fruit fruits[], int n) {
    int dp[MAX_FRUITS + 1][MAX_WEIGHT + 1];
    int choice[MAX_FRUITS + 1][MAX_WEIGHT + 1];
    
    memset(dp, 0, sizeof(dp));
    memset(choice, 0, sizeof(choice));
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= MAX_WEIGHT; j++) {
            if (fruits[i - 1].weight <= j) {
                int include_value = fruits[i - 1].value + dp[i - 1][j - fruits[i - 1].weight];
                int exclude_value = dp[i - 1][j];
                
                if (include_value > exclude_value) {
                    dp[i][j] = include_value;
                    choice[i][j] = 1;
                } else {
                    dp[i][j] = exclude_value;
                }
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    
    printf("装水果的策略为:\n");
    int i = n;
    int j = MAX_WEIGHT;
    while (i > 0 && j > 0) {
        if (choice[i][j] == 1) {
            printf("装入水果:%s(重量:%d kg,价值:%d 元)\n", fruits[i - 1].name, fruits[i - 1].weight, fruits[i - 1].value);
            j -= fruits[i - 1].weight;
        }
        i--;
    }
}

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