本题由于输入的时候进行了排序,故不用排序了,且由于是从最大的数开始深度搜索,所以最后输出的必然是按照数字串中数字串的长度从小到大输出。本题关键点就在于如何使输出的不重复输出。我才用的办法是借用容器vector进行了存储,如果与前面已经存入容器的不同,则可以进入vector数组中,并经行输出操作即可。下面附上代码。注意深度搜索时要回溯一下。
#include<iostream>
#include<vector>
using namespace std;
vector<int> kill[10000];
int f[13];
int ko[13];
int t,n,sum,flag,g,u;
int main()
{
void dfs(int k);
while(cin>>t>>n)
{
if(n==0)
break;
cout<<"Sums of "<<t<<":"<<endl;
flag=0;
sum=0;
g=1;
u=1;
for(int i=1;i<=n;i++)
cin>>ko[i];
dfs(1);
if(flag==0)
cout<<"NONE"<<endl;
for(int i=1;i<=g;i++)
kill[i].clear();
}
return 0;
}
void dfs(int k)
{
void output(int f[]);
if(sum>t)
return ;
else if(sum==t)
{
output(f);
flag=1;
}
for(int j=k;j<=n;j++)
if(ko[j]+sum<=t)
{
f[u]=ko[j];
u=u+1;
sum=sum+ko[j];
dfs(j+1);
u=u-1;
sum=sum-ko[j];
}
}
void output(int f[])
{
if(g==1)
{
for(int j=1;j<=u-1;j++)
{
if(j<(u-1))
cout<<f[j]<<"+";
else cout<<f[j]<<endl;
kill[g].push_back(f[j]);
}
g=g+1;
}
else{
int max=0;
for(int j=1;j<g;j++)
{
if((u-1)!=kill[j].size())
max=max+1;
else {
for(int k=1;k<=u-1;k++)
if(f[k]!=kill[j][k-1])
{
max=max+1;
break;
}
}
}
if(max==g-1)
{
for(int j=1;j<=u-1;j++)
{
if(j!=(u-1))
cout<<f[j]<<"+";
else cout<<f[j]<<endl;
kill[g].push_back(f[j]);
}
g=g+1;
}
}
}