将一个数组划分成总和相等的两部分(分割数组)
思想
1. 先求和sum/2,判断是否可分割
2. 递归求和
c++代码
include <iostream>
include<list>
using namespace std;
int getSum(int A[], int len)
{
int sum = 0;
for (int i = 0; i<len; i++)
{
sum += A[i];
}
return sum;
}
bool foo(int A[], int len, int curSum, int defSum, int B[], int curPos)
{
if (curSum == defSum)
{
return true;
}
if (len == 0)
return false;
bool bFound = false;
for (int i = 0; i < len; i++)
{
if (curSum + A[i] <= defSum)
{
B[curPos++] = A[i];
if (foo(&A[i+1], len - 1, curSum + A[i], defSum, B, curPos))
{
bFound = true;
break;
}
B[curPos] = 0;
curPos--;
}
}
return bFound;
}
void main()
{
int Array[1000];
int length;
while (cin >> length)
{
for (int i = 0; i < length; i++)
{
cin >> Array[i];
}
int B[500];
int sum = getSum(Array, length);
if (sum % 2 == 0)
{
bool JudgeSuccess = foo(Array, length, 0, sum / 2, B, 0);
if (JudgeSuccess)
cout << "True" << endl;
else
cout << "False" << endl;
}
else
cout << "False" << endl;
}
system("pause");
}