有n个数字,范围是1-100。 n的范围是1-1000。
另一个数字k。其界限为1 <= k <= 10 ^ 6
如何检查是否可以将给定的n个数除以两个集合,使得两个组数之和为&lt; = k。
我正在寻找一种高级实现方法或算法,如果可以进行划分,它将返回true。
答案 0 :(得分:0)
基于DP的解决方案,复杂度为O(n * sum)
for (int i = 0; i < n; i++) {
sum += a[i];
}
int[][] dp = new int[n + 1][sum + 1];
for (int i = 0; i <= n; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <= sum; j++) {
dp[i + 1][j] = dp[i][j];
if (a[i] <= j) {
dp[i + 1][j] |= dp[i][j - a[i]];
}
}
}
for (int i = sum / 2; i >= 0; i--) {
if (dp[n][i] == 1) {
int x = sum - i;
if (x > k || i > k) {
System.out.println("NO");
} else {
System.out.println("YES");
}
break;
}
}