#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Attraction {
char name[50];
int time;
int score;
};
int travelOptimization(int tripDuration, struct Attraction *attractions, int attractionCount) {
int minTime = attractions[0].time;
for (int i = 1; i < attractionCount; ++i)
{
int curTime = attractions[i].time;
if (curTime < minTime) {
minTime = curTime;
}
}
if (tripDuration < minTime) {
printf("旅行时间 %d 小于所有景点的最小时间 %d\n", tripDuration, minTime);
return -1;
}
int timeCount = tripDuration + 1;
int** dpArray = (int**)malloc(attractionCount * sizeof(int*));
for (int i = 0; i < attractionCount; ++i) {
dpArray[i] = (int*)malloc(timeCount * sizeof(int));
}
for (int i = 0; i < attractionCount; ++i)
{
int curTime = attractions[i].time;
int curScore = attractions[i].score;
for (int t = minTime; t < timeCount; ++t)
{
int preTotalScore = 0;
if (i > 0) {
preTotalScore = dpArray[i - 1][t];
}
int curTotalScore = 0;
if (t >= curTime) {
curTotalScore = curScore;
}
if (t > curTime && i > 0) {
curTotalScore += dpArray[i-1][t - curTime];
}
int maxTotalScore = preTotalScore;
if (maxTotalScore < curTotalScore) {
maxTotalScore = curTotalScore;
}
dpArray[i][t] = maxTotalScore;
}
}
int maxScore = dpArray[attractionCount - 1][timeCount - 1];
printf("选择去");
int remainingTime = tripDuration;
for (int i = attractionCount - 1; i >= 0; --i) {
if (i > 0 && dpArray[i][remainingTime] != dpArray[i - 1][remainingTime]) {
printf("%s ", attractions[i].name);
remainingTime -= attractions[i].time;
}
}
printf("\n");
for (int i = 0; i < attractionCount; ++i) {
free(dpArray[i]);
}
free(dpArray);
return maxScore;
}
int main() {
int tripDuration = 4;
struct Attraction attractions[] = {
{"故宫", 1, 7},
{"颐和园", 2, 8},
{"长城", 3, 9},
{"天坛", 1, 6}
};
int attractionCount = sizeof(attractions) / sizeof(struct Attraction);
int maxScore = 0;
maxScore = travelOptimization(tripDuration, attractions, attractionCount);
if (maxScore > 0) {
printf("旅行能够获得的最大评分是 %d\n", maxScore);
}
return 0;
}