根据C ++中的给定条件,将数组拆分为相等的总和
在这里,我们将看到一个问题。假设给出一个数组arr。我们必须检查数组是否可以分为两部分,例如-
两个子数组的子元素将相同
所有元素(均为5的倍数)将在同一组中
所有3的倍数,但不是5的倍数的所有元素将在同一组中
所有其他元素将在其他组中。
假设数组元素为{1,4,3},则可以将其拆分,因为{1,3}的总和与{4}的总和相同,并且组对于给定条件也是正确的。
算法
isSplitArray(arr,n,start,left_sum,right_sum)-
Begin
if start = n, then return true when left_sum = right_sum, otherwise false
if arr[start] is divisible by 5, then add arr[start] with the left_sum
else if arr[start] is divisible by 3, then add arr[start] with the right_sum
else
return isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) OR isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start])
isSplitArray(arr, n, start + 1, left_sum, right_sum)
End示例
#include <iostream>
using namespace std;
bool isSplitArray(int* arr, int n, int start, int left_sum, int right_sum) {
if (start == n) //when it reaches at the end
return left_sum == right_sum;
if (arr[start] % 5 == 0) //when the element is divisible by 5, add to left sum
left_sum += arr[start];
else if (arr[start] % 3 == 0) //when the element is divisible by 3 but not 5, add to right sum
right_sum += arr[start];
else // otherwise it can be added to any of the sub-arrays
return isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) || isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start]);
//对于element为3或5的倍数的情况。-
return isSplitArray(arr, n, start + 1, left_sum, right_sum);
}
int main() {
int arr[] = {1, 4, 3};
int n = sizeof(arr)/sizeof(arr[0]);
if(isSplitArray(arr, n, 0, 0, 0)){
cout <<"Can be split";
} else {
cout <<"Can not be split";
}
}输出结果
Can be split