#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[20];
int time;
int score;
} Place_information;
void fun_max(Place_information* place_information, int place_information_size, int days) {
int** dp = (int**)malloc((place_information_size+1) * sizeof(int*));
for (int i = 0; i <= place_information_size; i++) {
dp[i] = (int*)calloc(days+1, sizeof(int));
}
for (int i = 1; i <= place_information_size; i++) {
for (int j = 1; j <= days; j++) {
if (place_information[i-1].time <= j) {
dp[i][j] = dp[i-1][j] > (dp[i-1][j-place_information[i-1].time] + place_information[i-1].score) ?
dp[i-1][j] : (dp[i-1][j-place_information[i-1].time] + place_information[i-1].score);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
printf("选择的景点的总评分为:%d\n", dp[place_information_size][days]);
printf("选择的景点分别是:\n");
int i = place_information_size;
int j = days;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i-1][j]) {
printf("《%s》 ", place_information[i-1].name);
j -= place_information[i-1].time;
}
i--;
}
for (int i = 0; i <= place_information_size; i++) {
free(dp[i]);
}
free(dp);
}
int main() {
Place_information place_information[] = {
{"故宫", 1, 7},
{"颐和园", 2, 8},
{"长城", 3, 9},
{"天坛", 1, 6}
};
int place_information_size = sizeof(place_information) / sizeof(place_information[0]);
int days = 4;
fun_max(place_information, place_information_size, days);
return 0;
}