#include <stdio.h>
typedef struct {
char name[10];
int weight;
int value;
}Fruit_info;
#define MAX_WEIGHT 20
void print_fruit(int dp[][MAX_WEIGHT + 1], Fruit_info items[], int items_size) {
int i = items_size;
int j = MAX_WEIGHT;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i - 1][j]) {
printf("装入 %s, 重量:%dkg, 价值:%d元\n", items[i - 1].name, items[i - 1].weight, items[i - 1].value);
j -= items[i - 1].weight;
}
i--;
}
}
int solveKnapsack(Fruit_info items[], int items_size) {
int dp[items_size + 1][MAX_WEIGHT + 1];
for (int i = 0; i <= items_size; i++) {
for (int w = 0; w <= MAX_WEIGHT; w++) {
if (i == 0 || w == 0) {
dp[i][w] = 0;
}
else if (items[i - 1].weight <= w) {
dp[i][w] = dp[i - 1][w]>(items[i - 1].value + dp[i - 1][w - items[i - 1].weight])?
dp[i - 1][w]:(items[i - 1].value + dp[i - 1][w - items[i - 1].weight]);
}
else {
dp[i][w] = dp[i - 1][w];
}
}
}
print_fruit(dp, items, items_size);
return dp[items_size][MAX_WEIGHT];
}
int main() {
Fruit_info items[] = {
{"苹果", 15, 300},
{"香蕉", 18, 180},
{"橘子", 10, 150},
{"猕猴桃", 9, 270}
};
int items_size = sizeof(items) / sizeof(items[0]);
int count = solveKnapsack(items, items_size);
printf("\n背包中装入水果的总价值最高为:%d元\n", count);
return 0;
}