From f067fdb8bab2ec92cd4e69a72dd9865a60f0d416 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Apr 2023 19:06:13 +0800 Subject: [PATCH] modify code --- .../第03期/mca_09/Code04_Knapsack.java | 63 ------------ .../第03期/mca_09/Code04_Knapsack1.java | 97 +++++++++++++++++++ .../第03期/mca_09/Code04_Knapsack2.java | 76 +++++++++++++++ .../第03期/mca_09/Code04_Knapsack3.java | 74 ++++++++++++++ 4 files changed, 247 insertions(+), 63 deletions(-) delete mode 100644 MCA算法突击课/第03期/mca_09/Code04_Knapsack.java create mode 100644 MCA算法突击课/第03期/mca_09/Code04_Knapsack1.java create mode 100644 MCA算法突击课/第03期/mca_09/Code04_Knapsack2.java create mode 100644 MCA算法突击课/第03期/mca_09/Code04_Knapsack3.java diff --git a/MCA算法突击课/第03期/mca_09/Code04_Knapsack.java b/MCA算法突击课/第03期/mca_09/Code04_Knapsack.java deleted file mode 100644 index 05f4cf7..0000000 --- a/MCA算法突击课/第03期/mca_09/Code04_Knapsack.java +++ /dev/null @@ -1,63 +0,0 @@ -package 第03期.mca_09; - -public class Code04_Knapsack { - - // 所有的货,重量和价值,都在w和v数组里 - // 为了方便,其中没有负数 - // bag背包容量,不能超过这个载重 - // 返回:不超重的情况下,能够得到的最大价值 - public static int maxValue(int[] w, int[] v, int bag) { - if (w == null || v == null || w.length != v.length || w.length == 0) { - return 0; - } - // 尝试函数! - return process(w, v, 0, bag); - } - - // index 0~N - // rest 负~bag - public static int process(int[] w, int[] v, int index, int rest) { - if (rest < 0) { - return -1; - } - if (index == w.length) { - return 0; - } - int p1 = process(w, v, index + 1, rest); - int p2 = 0; - int next = process(w, v, index + 1, rest - w[index]); - if (next != -1) { - p2 = v[index] + next; - } - return Math.max(p1, p2); - } - - public static int dp(int[] w, int[] v, int bag) { - if (w == null || v == null || w.length != v.length || w.length == 0) { - return 0; - } - int N = w.length; - int[][] dp = new int[N + 1][bag + 1]; - for (int index = N - 1; index >= 0; index--) { - for (int rest = 0; rest <= bag; rest++) { - int p1 = dp[index + 1][rest]; - int p2 = 0; - int next = rest - w[index] < 0 ? -1 : dp[index + 1][rest - w[index]]; - if (next != -1) { - p2 = v[index] + next; - } - dp[index][rest] = Math.max(p1, p2); - } - } - return dp[0][bag]; - } - - public static void main(String[] args) { - int[] weights = { 3, 2, 4, 7, 3, 1, 7 }; - int[] values = { 5, 6, 3, 19, 12, 4, 2 }; - int bag = 15; - System.out.println(maxValue(weights, values, bag)); - System.out.println(dp(weights, values, bag)); - } - -} diff --git a/MCA算法突击课/第03期/mca_09/Code04_Knapsack1.java b/MCA算法突击课/第03期/mca_09/Code04_Knapsack1.java new file mode 100644 index 0000000..eb878c7 --- /dev/null +++ b/MCA算法突击课/第03期/mca_09/Code04_Knapsack1.java @@ -0,0 +1,97 @@ +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_Knapsack1 { + + 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; + } + clear(); + int ans1 = f1(0, m); + clear(); + int ans2 = f2(0, m); + out.println(ans1); + out.println(ans2 == -1 ? 0 : ans2); + out.flush(); + } + } + + public static void clear() { + for (int i = 0; i < n; i++) { + for (int j = 0; j <= m; j++) { + dp[i][j] = -2; + } + } + } + + public static int f1(int i, int j) { + if (j < 0) { + return -1; + } + if (i == n) { + return 0; + } + if (dp[i][j] != -2) { + return dp[i][j]; + } + int p1 = f1(i + 1, j); + int p2 = 0; + int next2 = f1(i + 1, j - v[i]); + if (next2 != -1) { + p2 = w[i] + next2; + } + int ans = Math.max(p1, p2); + dp[i][j] = ans; + return ans; + } + + public static int f2(int i, int j) { + if (j < 0) { + return -1; + } + if (i == n) { + return j == 0 ? 0 : -1; + } + if (dp[i][j] != -2) { + return dp[i][j]; + } + int p1 = f2(i + 1, j); + int p2 = -1; + int next2 = f2(i + 1, j - v[i]); + if (next2 != -1) { + p2 = w[i] + next2; + } + int ans = Math.max(p1, p2); + dp[i][j] = ans; + return ans; + } + +} diff --git a/MCA算法突击课/第03期/mca_09/Code04_Knapsack2.java b/MCA算法突击课/第03期/mca_09/Code04_Knapsack2.java new file mode 100644 index 0000000..1159c8c --- /dev/null +++ b/MCA算法突击课/第03期/mca_09/Code04_Knapsack2.java @@ -0,0 +1,76 @@ +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]; + } + +} diff --git a/MCA算法突击课/第03期/mca_09/Code04_Knapsack3.java b/MCA算法突击课/第03期/mca_09/Code04_Knapsack3.java new file mode 100644 index 0000000..6ccf6c4 --- /dev/null +++ b/MCA算法突击课/第03期/mca_09/Code04_Knapsack3.java @@ -0,0 +1,74 @@ +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_Knapsack3 { + + 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]; + 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[j] = 0; + } + for (int i = n - 1; i >= 0; i--) { + for (int j = m; j >= 0; j--) { + if (j - v[i] >= 0) { + dp[j] = Math.max(dp[j], w[i] + dp[j - v[i]]); + } + } + } + return dp[m]; + } + + public static int f2() { + dp[0] = 0; + for (int j = 1; j <= m; j++) { + dp[j] = -1; + } + for (int i = n - 1; i >= 0; i--) { + for (int j = m; j >= 0; j--) { + if (j - v[i] >= 0 && dp[j - v[i]] != -1) { + dp[j] = Math.max(dp[j], w[i] + dp[j - v[i]]); + } + } + } + return dp[m]; + } + +}