感想:DFS递归求解
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<deque>
#include<cmath>
using namespace std;
int sum=0,ma1x;
vector<int> q;
vector<vector<int> > ans;
void get(int i,int b[],int a[],int M){
sum+=a[i];
if(sum>ma1x){
sum-=a[i];
return ;
}
q.push_back(a[i]);
if(q.size()!=1&&b[sum]==1)
ans.push_back(q);
for(int j=i+1;j<M;j++){
get(j,b,a,M);
}
q.pop_back();
sum-=a[i];
}
bool comp1(vector<int> &a,vector<int> &b){
if(a.size()!=b.size())
return a.size()<b.size();
return a<b;
}
int main(){
int N,i,M,o,j,k;
cin>>N;
for(o=0;o<N;o++){
ans.clear();
int b[100000]={0};
int top=0,end=0;
cin>>M;
int *a=new int[M];
for(i=0;i<M;i++){
scanf("%d",&a[i]);
b[a[i]]=1;
}
sort(a,a+M);
ma1x=a[M-1];
//q.push(0);
for(j=0;j<M;j++)
get(j,b,a,M);
sort(ans.begin(),ans.end(),comp1);
if(!ans.empty())
for(j=0;j<ans.size();j++){
int s=0;
for(k=0;k<ans[j].size();k++){
if(k!=0)
printf("+");
printf("%d",ans[j][k]);
s+=ans[j][k];
}
printf("=%d\n",s);
}
else{
printf("Can't find any equations.\n");
}
printf("\n");
delete a;
}
}