编辑代码

#include <stdio.h>

struct Site {
    char name[20];
    int time;
    int score;
};

void maximizeValue(struct Site sites[], int n, int maxTime) {
    int dp[n+1][maxTime+1];

    for (int i = 0; i <= n; i++)
        dp[i][0] = 0;
    for (int j = 0; j <= maxTime; j++)
        dp[0][j] = 0;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= maxTime; j++) {
            if (sites[i-1].time > j)
                dp[i][j] = dp[i-1][j];
            else
                dp[i][j] = (dp[i-1][j] > (dp[i-1][j-sites[i-1].time] + sites[i-1].score)) ?
                            dp[i-1][j] : (dp[i-1][j-sites[i-1].time] + sites[i-1].score);
        }
    }

    // 回溯选择的景点
    int i = n, j = maxTime;
    while (i > 0 && j > 0) {
        if (dp[i][j] != dp[i-1][j]) {
            printf("选择景点:%s, 时间:%d天, 评分:%d\n", sites[i-1].name, sites[i-1].time, sites[i-1].score);
            j -= sites[i-1].time;
        }
        i--;
    }
}

int main() {
    int n = 4;
    int maxTime = 4;

    struct Site sites[] = {
        {"故宫", 1, 7},
        {"颐和园", 2, 8},
        {"长城", 3, 9},
        {"天坛", 1, 6}
    };

    printf("选择的景点列表:\n");
    maximizeValue(sites, n, maxTime);

    return 0;
}