将n个数字分成两组,每组的总和小于等于k

时间:2017-09-16 13:26:45

标签: algorithm

有n个数字,范围是1-100。 n的范围是1-1000。

另一个数字k。其界限为1 <= k <= 10 ^ 6

如何检查是否可以将给定的n个数除以两个集合,使得两个组数之和为&lt; = k。

我正在寻找一种高级实现方法或算法,如果可以进行划分,它将返回true。

1 个答案:

答案 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;
    }
  }