编辑代码

public class TravelOptimization {
    public static void travelOptimization(int[] time, int[] score, int totalDays) {
        int n = time.length;
        int[][] dp = new int[n + 1][totalDays + 1];

        // 景点名称数组
        String[] attractions = {"故宫", "颐和园", "长城", "天坛"};

        for (int i = 1; i <= n; i++) { //外层循环,遍历每个景点
            for (int j = 1; j <= totalDays; j++) { //内层循环,遍历每个可用的天数
                if (j >= time[i - 1]) { //判断当前可用天数是否大于等于选择当前景点所需时间
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - time[i - 1]] + score[i - 1]);
                    //满足,则选择当前景点
                } else {
                    dp[i][j] = dp[i - 1][j];
                    //不选择当前景点时的最大价值。
                }
            }
        }
        int maxScore = dp[n][totalDays];
        System.out.println("最大价值为:" + maxScore);
        System.out.println("选择的景点有:");
        int daysLeft = totalDays;
        for (int i = n; i > 0 && maxScore > 0; i--) { //循环逆序遍历景点
            if (maxScore != dp[i - 1][daysLeft]) { //判断是否选择了当前景点
                System.out.println(attractions[i - 1] + "(时间:" + time[i - 1] + "天,评分:" + score[i - 1] + ")");
                maxScore -= score[i - 1];
                daysLeft -= time[i - 1];
            }
        }
    }
    public static void main(String[] args) {
        //景点所需时间:故宫:1天,颐和园:2天;长城:3天;天坛:1天
        int[] time = {1, 2, 3, 1};
        //景点对应的评分:故宫:7分;颐和园:8分;长城:9分;天坛:6分
        int[] score = {7, 8, 9, 6};
        //假期总天数
        int totalDays = 4;
        //调用旅游优化算法
        travelOptimization(time, score, totalDays);
    }
}