问题如下: 我们有一个整数数组...我们需要检查它是否可以划分为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];
}
}
此解决方案似乎无法在所有输入中使用,我无法弄清楚为什么...您能帮我吗?
答案 0 :(得分:0)
这不是布尔值的问题,就像附近的解决方案一样。
您必须保留当前最佳解决方案:
然后进行递归。开始排序是个好主意。
编程愉快。