package 第03期.mca_09; // 背包问题 // 测试链接 : https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e // 请同学们务必参考如下代码中关于输入、输出的处理 // 这是输入输出处理效率很高的写法 // 提交以下所有代码,把主类名改成Main,可以直接通过 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; public class Code04_Knapsack2 { public static int MAXN = 1010; public static int[] v = new int[MAXN]; public static int[] w = new int[MAXN]; public static int[][] dp = new int[MAXN][MAXN]; public static int n, m; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while (in.nextToken() != StreamTokenizer.TT_EOF) { n = (int) in.nval; in.nextToken(); m = (int) in.nval; for (int i = 0; i < n; i++) { in.nextToken(); v[i] = (int) in.nval; in.nextToken(); w[i] = (int) in.nval; } int ans1 = f1(); int ans2 = f2(); out.println(ans1); out.println(ans2 == -1 ? 0 : ans2); out.flush(); } } public static int f1() { for (int j = 0; j <= m; j++) { dp[n][j] = 0; } for (int i = n - 1; i >= 0; i--) { for (int j = 0; j <= m; j++) { dp[i][j] = dp[i + 1][j]; if (j - v[i] >= 0) { dp[i][j] = Math.max(dp[i][j], w[i] + dp[i + 1][j - v[i]]); } } } return dp[0][m]; } public static int f2() { dp[n][0] = 0; for (int j = 1; j <= m; j++) { dp[n][j] = -1; } for (int i = n - 1; i >= 0; i--) { for (int j = 0; j <= m; j++) { dp[i][j] = dp[i + 1][j]; if (j - v[i] >= 0 && dp[i + 1][j - v[i]] != -1) { dp[i][j] = Math.max(dp[i][j], w[i] + dp[i + 1][j - v[i]]); } } } return dp[0][m]; } }