这是一道通过率很高的水搜索题,可是不会搜索的我在用子集生成法搞了两个小时后,终于AC
#include "stdio.h"
#include <iostream>
#include <cstring>
using namespace std;
int m,n,tt;
int num[15],vis[15];
int A[100005][15],T[15];
void dfs(int p,int *B,int cur)
{
if(cur==p)
{
int sum=0;
for(int i=0; i<cur; i++)
{
if(B[i])sum+=num[i];
}
int flag=0;
if(sum==m)
{
int u=0;
memset(T,0,sizeof(T));
for(int i=0;i<cur;i++)
{
if(B[i])T[u++]=num[i];
}
int q;
for(int i=0;i<tt;i++)
{
q=0;
for(int j=0;j<u;j++)
if(A[i][j]!=T[j]){q=1;break;}
if(q==0)break;
}
if(q==1)
{
for(int i=0;i<15;i++)
A[tt][i]=T[i];
for(int i=0; i<cur; i++)
{
if(B[i]&&!flag)
{
printf("%d",num[i]);
flag=1;
}
else if(B[i])printf("+%d",num[i]);
}
printf("\n");
tt++;
}
}
return;
}
B[cur]=1;
dfs(p,vis,cur+1);
B[cur]=0;
dfs(p,vis,cur+1);
}
int main()
{
while(cin>>m>>n)
{
if(!m&&!n)break;
tt=1;
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
cout<<"Sums of "<<m<<":"<<endl;
for(int i=0; i<n; i++)
cin>>num[i];
dfs(n,vis,0);
if(tt==1)cout<<"NONE"<<endl;
}
return 0;
}