思路:输出顺序的确定:先对数据进行升序排列,再分别对不同长度的结果进行深搜,同时更新记录输出结果的数组。
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 32
using namespace std;
int len, tmp,tag=0;
int rec[maxn], ans[maxn];
void dfs(int start, int sum, int n)
{
if(sum>rec[tmp-1])
return;
for(int i = start; i < tmp; i++)
{
ans[n]=rec[i];
sum += rec[i];
n++;
if(n == len)
{
int low = 0, high = tmp-1, mid;
while(low<=high)
{
mid = (low+high)>>1;
if(rec[mid]<sum)
low=mid+1;
else if(rec[mid]>sum)
high=mid-1;
else if(rec[mid]==sum)
{
tag=1;
for(int j=0;j<n-1;j++)
cout<<ans[j]<<"+";
cout<<ans[n-1]<<"="<<sum<<endl;
break;
}
}
}
dfs(i+1, sum, n);
sum -= rec[i];
n--;
}
}
int main()
{
int N, M;
cin>>N;
while(N--)
{
tag = 0;
cin>>tmp;
memset(ans, 0, sizeof(ans));
for(int i = 0; i < tmp; i++)
cin>>rec[i];
sort(rec, rec+tmp);
for(int i = 2; i < tmp; i++)
{
len = i;
dfs(0,0,0);
}
if(!tag)
cout<<"Can't find any equations."<<endl;
cout<<endl;
}
return 0;
}