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