将数组中的int元素分为2个相等或几乎相等的suma

时间:2020-09-10 09:55:00

标签: java

问题如下: 我们有一个整数数组...我们需要检查它是否可以划分为2个数组,其中两个数组的元素之和是相同的...如果总和不相等,则将其划分为2,其总数应尽可能相等/接近。

这是检查是否可以用相等的总和分区的部分:

public boolean canPartition(int[] num) {
        int sum = 0;
        for (int i = 0; i < num.length; i++)
            sum += num[i];

        // if 'sum' is a an odd number, we can't have two subsets with equal sum
        if(sum % 2 != 0)
            return false;

        return this.canPartitionRecursive(num, sum/2, 0);
    }

    private boolean canPartitionRecursive(int[] num, int sum, int currentIndex) {
        // base check
        if (sum == 0)
            return true;

        if(num.length == 0 || currentIndex >= num.length)
            return false;

        // recursive call after choosing the number at the currentIndex
        // if the number at currentIndex exceeds the sum, we shouldn't process this
        if( num[currentIndex] <= sum ) {
            if(canPartitionRecursive(num, sum - num[currentIndex], currentIndex + 1))
                return true;
        }

        // recursive call after excluding the number at the currentIndex
        return canPartitionRecursive(num, sum, currentIndex + 1);
    }
    

如果返回true,则sum1 = sum2 = sum / 2

如果返回false,则运行以下命令:

Arrays.sort(itemsWeight);

        int sum1 = 0;
        int sum2 = 0;
        for (int j = numOfItems - 1; j >= 0; j--) {

            if (sum1 < sum2) {
                sum1 += itemsWeight[j];
            } else {
                sum2 += itemsWeight[j];
            }
           
        }

此解决方案似乎无法在所有输入中使用,我无法弄清楚为什么...您能帮我吗?

1 个答案:

答案 0 :(得分:0)

这不是布尔值的问题,就像附近的解决方案一样。

  • 该问题读取为计算总和的一半:一半。 (总和可能是奇数,所以是整数的一半。)
  • 然后选择总和<= HALF,总和最大的第一个数组的元素。
  • 第二个数组由其余元素组成。

您必须保留当前最佳解决方案:

  • 数组[],总和为0
  • 可能的候选对象:所有数组

然后进行递归。开始排序是个好主意。

编程愉快。