回溯,主要是去重
#include<stdio.h>
int f,n,k,s[12],a[12];
void dfs(int p,int l)
{int i;
if(!l)
{printf("%d",a[0]);
for(f=i=1;i<k;i++)
printf("+%d",a[i]);
puts("");
return;
}
if(p>=n||l<0)
return;
for(i=p;i<n;i++)
if(i==p||s[i]!=s[i-1])//去重
{a[k++]=s[i];
dfs(i+1,l-s[i]);
k--;
}
}
int main()
{int i,m;
while(scanf("%d%d",&m,&n),m)
{
f=k=0;
for(i=0;i<n;i++)
scanf("%d",&s[i]);
printf("Sums of %d:/n",m);
dfs(0,m);
if(!f)
puts("NONE");
}
}