题目地址:​​点击打开链接​

思路:先排序,再依次输出式子短的

AC代码:

#include <iostream>
#include<algorithm>

using namespace std;

int pos[31];
int a[31];
int flag,num,n;

void print(int sum)
{
int i;
for(i=pos[num-1]+1; i<n; i++)
{
if(sum == a[i])//判断求得的最大值是否存在
break;
}
if(i < n)
{
flag = 1;
for(i=0; i<num; i++)
{
if(i)
cout<<"+";
cout<<a[pos[i]];
}
cout<<"="<<sum<<endl;
}
}
int search(int k,int sum)
{
int b,i;
if(k == num)
{
print(sum);
return 1;
}
if(k == 0)
b = 0;
else
b = pos[k-1] + 1;//从目前构成加法等式的最后一个元素往后搜
for(i=b; i<n-1; i++)
{
pos[k] = i;
if(sum + a[pos[k]] > a[n-1])//比最大值还大,停止搜索
return 0;
if(!search(k+1,sum+a[pos[k]]) && pos[k+1] - pos[k] == 1)//当相邻的2个元素的和都比最大值大,以后的数更比最大值大,停止搜索
return 0;
}
return 1;
}
int main()
{
int t,i;
cin>>t;
while(t--)
{
flag = 0;
cin>>n;
for(i=0; i<n; i++)
{
cin>>a[i];
}
sort(a,a+n);
for(i=2; i<n; i++)
{
num = i;
search(0,0);
}
if(!flag)
cout<<"Can't find any equations."<<endl;
cout<<endl;
}
return 0;
}