Description
牛客网 2018校招真题 双袋购物
Solving Ideas
01背包
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strs = br.readLine().split(" ");
int n = Integer.parseInt(strs[0]);
int a = Integer.parseInt(strs[1]), b = Integer.parseInt(strs[2]);
int[] v = new int[n + 2], w = new int[n + 2];
for (int i = 1; i <= n; i++) {
strs = br.readLine().split(" ");
v[i] = Integer.parseInt(strs[0]);
w[i] = Integer.parseInt(strs[1]);
}
//对袋子1进行动态规划,resA[i]:一直使用袋子1到第i个点时的最大总价值
int[] bagA = new int[a + 1], resA = new int[n + 2];
for (int i = 1; i <= n; i++) {
for (int j = a; j >= v[i]; j--) {
bagA[j] = Math.max(bagA[j], bagA[j - v[i]] + w[i]);
}
resA[i] = bagA[a];
}
//对袋子2进行动态规划,反向进行,resB[i]:一直使用袋子2从第i个点到最后的最大总价值
int[] bagB = new int[b + 1], resB = new int[n + 2];
for (int i = n; i > 0; i--) {
for (int j = b; j >= v[i]; j--) {
bagB[j] = Math.max(bagB[j], bagB[j - v[i]] + w[i]);
}
resB[i] = bagB[b];
}
int res = 0;
for (int i = 0; i <= n; i++) {
res = Math.max(res, resA[i] + resB[i + 1]);
}
System.out.println(res);
}
}