李华在码头租货船,有 Q 种货船可以租赁。第 i 种货船的数量为 m[i], 租赁价格为 v[i],载货量为 w[i]。求预算为 V 的情况下,李华租的货船载货量总和 W 最大为多少?
输入格式
共两行。
第 1 行为两个用空格分隔开的整数:Q(1 <= Q <= 50) 、V(1 <= V <= 4000) 。Q 表示货船种类数,V 表示李华的预算。
第 2 行到第 Q + 1 行是 Q 种货船的详细信息。第 i + 1(1 <= i <= Q) 行有三个用空格分隔开的整数:m[i](1 <= m[i] <= 1000) 、v[i](1 <= v[i] <= 100) 、w[i](1 <= w[i] <= 100) ,表示第 i 种货船的数量、租赁价格和载货量。
输出格式
输出李华预算为 V 的情况下,货船载货量总和 W 的最大值。
输入样例:
多行文本
2 10
2 3 2
3 2 10
输出样例:
32
解答:import java.util.List; import java.util.ArrayList; import java.util.Arrays;
public class Main { public static int solution(int Q, int V, List<List> ships) { // 初始化 dp 数组 int[][] dp = new int[Q + 1][V + 1];
// 遍历每种货船
for (int i = 1; i <= Q; i++) {
int m = ships.get(i - 1).get(0); // 数量
int v = ships.get(i - 1).get(1); // 价格
int w = ships.get(i - 1).get(2); // 载货量
// 遍历预算
for (int j = 0; j <= V; j++) {
// 遍历当前货船的数量
for (int k = 0; k <= m && k * v <= j; k++) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v] + k * w);
}
}
}
// 返回最终结果
return dp[Q][V];
}
public static void main(String[] args) {
// 测试用例
List<List<Integer>> ships = new ArrayList<>();
ships.add(Arrays.asList(2, 3, 2));
ships.add(Arrays.asList(3, 2, 10));
List<List<Integer>> ships2 = new ArrayList<>();
ships2.add(Arrays.asList(30, 141, 47));
ships2.add(Arrays.asList(9, 258, 12));
ships2.add(Arrays.asList(81, 149, 13));
ships2.add(Arrays.asList(91, 236, 6));
ships2.add(Arrays.asList(27, 163, 74));
ships2.add(Arrays.asList(34, 13, 58));
ships2.add(Arrays.asList(61, 162, 1));
ships2.add(Arrays.asList(80, 238, 29));
ships2.add(Arrays.asList(36, 264, 28));
ships2.add(Arrays.asList(36, 250, 2));
ships2.add(Arrays.asList(70, 214, 31));
ships2.add(Arrays.asList(39, 116, 39));
ships2.add(Arrays.asList(83, 287, 4));
ships2.add(Arrays.asList(61, 269, 94));
ships2.add(Arrays.asList(23, 187, 46));
ships2.add(Arrays.asList(78, 33, 29));
ships2.add(Arrays.asList(46, 151, 2));
ships2.add(Arrays.asList(71, 249, 1));
ships2.add(Arrays.asList(67, 76, 85));
ships2.add(Arrays.asList(72, 239, 17));
ships2.add(Arrays.asList(61, 256, 49));
ships2.add(Arrays.asList(48, 216, 73));
ships2.add(Arrays.asList(39, 49, 74));
System.out.println(solution(2, 10, ships) == 32);
System.out.println(solution(23, 400, ships2) == 1740);
}
}