From d13b2a1c22d05e11d5f8c15d75490af269845d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B7=A6=E7=A8=8B=E4=BA=91?= Date: Tue, 19 Jan 2021 19:45:51 +0800 Subject: [PATCH] modify code --- .../Code02_SplitSumClosedSizeHalf.java | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/src/class23/Code02_SplitSumClosedSizeHalf.java b/src/class23/Code02_SplitSumClosedSizeHalf.java index 0f08fd1..d87f0d6 100644 --- a/src/class23/Code02_SplitSumClosedSizeHalf.java +++ b/src/class23/Code02_SplitSumClosedSizeHalf.java @@ -10,22 +10,22 @@ public class Code02_SplitSumClosedSizeHalf { for (int num : arr) { sum += num; } - return process(arr, 0, 0, sum >> 1, (arr.length & 1) == 0); + return process(arr, 0, 0, sum >> 1); } - public static int process(int[] arr, int i, int picks, int rest, boolean sizeEven) { + public static int process(int[] arr, int i, int picks, int rest) { if (i == arr.length) { - if (sizeEven) { + if ((arr.length & 1) == 0) { return picks == (arr.length >> 1) ? 0 : -1; } else { return (picks == (arr.length >> 1) || picks == (arr.length >> 1) + 1) ? 0 : -1; } } - int p1 = process(arr, i + 1, picks, rest, sizeEven); + int p1 = process(arr, i + 1, picks, rest); int p2 = -1; int next2 = -1; if (arr[i] <= rest) { - next2 = process(arr, i + 1, picks + 1, rest - arr[i], sizeEven); + next2 = process(arr, i + 1, picks + 1, rest - arr[i]); } if (next2 != -1) { p2 = arr[i] + next2; @@ -33,7 +33,53 @@ public class Code02_SplitSumClosedSizeHalf { return Math.max(p1, p2); } - public static int dp(int[] arr) { + public static int dp1(int[] arr) { + if (arr == null || arr.length < 2) { + return 0; + } + int sum = 0; + for (int num : arr) { + sum += num; + } + sum >>= 1; + int N = arr.length; + int M = (arr.length + 1) >> 1; + int[][][] dp = new int[N + 1][M + 1][sum + 1]; + for (int i = 0; i <= N; i++) { + for (int j = 0; j <= M; j++) { + for (int k = 0; k <= sum; k++) { + dp[i][j][k] = -1; + } + } + } + for (int k = 0; k <= sum; k++) { + dp[N][M][k] = 0; + } + if ((arr.length & 1) != 0) { + for (int k = 0; k <= sum; k++) { + dp[N][M - 1][k] = 0; + } + } + for (int i = N - 1; i >= 0; i--) { + for (int picks = 0; picks <= M; picks++) { + for (int rest = 0; rest <= sum; rest++) { + int p1 = dp[i + 1][picks][rest]; + int p2 = -1; + int next2 = -1; + if (picks + 1 <= M && arr[i] <= rest) { + next2 = dp[i + 1][picks + 1][rest - arr[i]]; + } + if (next2 != -1) { + p2 = arr[i] + next2; + } + dp[i][picks][rest] = Math.max(p1, p2); + } + } + } + return dp[0][0][sum]; + } + + public static int dp2(int[] arr) { if (arr == null || arr.length < 2) { return 0; } @@ -73,6 +119,7 @@ public class Code02_SplitSumClosedSizeHalf { return Math.max(dp[N - 1][M][sum], dp[N - 1][N - M][sum]); } + // for test public static int[] randomArray(int len, int value) { int[] arr = new int[len]; for (int i = 0; i < arr.length; i++) { @@ -81,6 +128,7 @@ public class Code02_SplitSumClosedSizeHalf { return arr; } + // for test public static void printArray(int[] arr) { for (int num : arr) { System.out.print(num + " "); @@ -88,6 +136,7 @@ public class Code02_SplitSumClosedSizeHalf { System.out.println(); } + // for test public static void main(String[] args) { int maxLen = 20; int maxValue = 50; @@ -97,11 +146,13 @@ public class Code02_SplitSumClosedSizeHalf { int len = (int) (Math.random() * maxLen); int[] arr = randomArray(len, maxValue); int ans1 = right(arr); - int ans2 = dp(arr); - if (ans1 != ans2) { + int ans2 = dp1(arr); + int ans3 = dp2(arr); + if (ans1 != ans2 || ans1 != ans3) { printArray(arr); System.out.println(ans1); System.out.println(ans2); + System.out.println(ans3); System.out.println("Oops!"); break; }