编辑代码

#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;
}