#include <stdio.h>
#define NUM_SIGHT 4
#define MAX_DAYS 4
struct sightseeing {
char name[20];
int time;
int score;
};
int max(int a, int b) {
return (a > b) ? a : b;
}
void printSelectedSight(int dp[][MAX_DAYS + 1], struct sightseeing s_see[]) {
printf("去以下景点:\n");
int i = NUM_SIGHT;
int j = MAX_DAYS;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i - 1][j]) {
printf("%s (时间:%d天, 评分:%d)\n", s_see[i - 1].name, s_see[i - 1].time, s_see[i - 1].score);
j -= s_see[i - 1].time;
}
i--;
}
}
int maxScore(struct sightseeing s_see[]) {
int dp[NUM_SIGHT + 1][MAX_DAYS + 1] = {0};
for (int i = 1; i <= NUM_SIGHT; i++) {
for (int j = 1; j <= MAX_DAYS; j++) {
if (s_see[i - 1].time <= j) {
dp[i][j] = max(s_see[i - 1].score + dp[i - 1][j - s_see[i - 1].time], dp[i - 1][j]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
printSelectedSight(dp, s_see);
return dp[NUM_SIGHT][MAX_DAYS];
}
int main() {
struct sightseeing s_see[] = {
{"故宫", 1, 7},
{"颐和园", 2, 8},
{"长城", 3, 9},
{"天坛", 1, 6}
};
int maxScoreValue = maxScore(s_see);
printf("在%d天内能获得最大价值为:%d\n", MAX_DAYS, maxScoreValue);
return 0;
}