modify code

pull/6/head
左程云 5 years ago
parent 067da841a0
commit d13b2a1c22

@ -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;
}

Loading…
Cancel
Save