#include <stdio.h>
#include <string.h>
#define MAX_NAME_LENGTH 50
int max(int a, int b) {
return (a > b) ? a : b;
}
void optimizeTravel(int days, int scores[], int times[], char names[][MAX_NAME_LENGTH], int numSpots) {
int dp[numSpots + 1][days + 1];
int path[numSpots + 1][days + 1][numSpots + 1];
for (int i = 0; i <= numSpots; i++) {
for (int j = 0; j <= days; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (times[i - 1] > j) {
dp[i][j] = dp[i - 1][j];
} else {
int includeScore = dp[i - 1][j - times[i - 1]] + scores[i - 1];
int excludeScore = dp[i - 1][j];
if (includeScore > excludeScore) {
dp[i][j] = includeScore;
for (int k = 0; k < i; k++) {
path[i][j][k] = path[i - 1][j - times[i - 1]][k];
}
path[i][j][i - 1] = 1;
} else {
dp[i][j] = excludeScore;
for (int k = 0; k < i; k++) {
path[i][j][k] = path[i - 1][j][k];
}
}
}
}
}
printf("最大评分为:%d\n", dp[numSpots][days]);
printf("旅游路线为:\n");
int remainingDays = days;
for (int i = numSpots; i >= 1; i--) {
if (path[numSpots][days][i - 1] == 1) {
printf("景点:%s(评分:%d,天数:%d)\n", names[i - 1], scores[i - 1], times[i - 1]);
remainingDays -= times[i - 1];
}
}
}
int main() {
int days = 4;
int scores[] = {7, 8, 9, 6};
int times[] = {1, 2, 3, 1};
char names[][MAX_NAME_LENGTH] = {"故宫", "颐和园", "长城", "天坛"};
int numSpots = sizeof(scores) / sizeof(scores[0]);
optimizeTravel(days, scores, times, names, numSpots);
return 0;
}