import java.util.*;
public class Knapsack {
public static void main(String[] args) {
int max_time = 4;
Attraction[] attractions = {new Attraction("故宫", 1, 7), new Attraction("颐和园", 2, 8), new Attraction("长城", 3, 9), new Attraction("天坛", 1, 6)};
int num_attractions = attractions.length;
int[] weights = new int[num_attractions];
int[] values = new int[num_attractions];
for (int i = 0; i < num_attractions; i++) {
weights[i] = attractions[i].time;
values[i] = attractions[i].rating;
}
List<Integer> selected = knapsack(max_time, weights, values, num_attractions);
System.out.println("以下是您可以获得的最大价值的景点:");
for (int i = 0; i < selected.size(); i++) {
System.out.println((i + 1) + ". " + attractions[selected.get(i)].name);
}
}
public static List<Integer> knapsack(int max_time, int[] weights, int[] values, int num_attractions) {
int[][] dp = new int[num_attractions + 1][max_time + 1];
for (int i = 1; i <= num_attractions; i++) {
for (int w = 1; w <= max_time; w++) {
if (weights[i - 1] <= w) {
dp[i][w] = Math.max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
int res = dp[num_attractions][max_time];
int w = max_time;
List<Integer> selected = new ArrayList<>();
for (int i = num_attractions; i > 0 && res > 0; i--) {
if (res == dp[i - 1][w]) {
continue;
} else {
selected.add(i - 1);
res -= values[i - 1];
w -= weights[i - 1];
}
}
return selected;
}
}