编辑代码

#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;
}