此题重点在于要防止重复计算,引入temp,
记录上一个,只要下一个数与他不相等即可。。
这里也是用回朔搜索,来找完所有可能。。
#include"stdio.h"
#include"string.h"
int visit[100];
int a[100],b[100];
int n,m,flag;
void bfs(int x,int sum,int k)
{
int i;
if(sum==n)
{
printf("%d",b[0]);
for(i=1;i<k;i++)
printf("+%d",b[i]);
printf("\n");
flag=1;
}
int temp=-1;
for(i=x;i<m;i++)
{
if(!visit[i]&&a[i]!=temp)
{
temp=a[i];
b[k]=a[i];
visit[i]=1;
bfs(i,sum+a[i],k+1);
visit[i]=0;
}
}
}
int main()
{
int i;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=0;i<m;i++)
scanf("%d",&a[i]);
flag=0;
memset(visit,0,sizeof(visit));
printf("Sums of %d:\n",n);
bfs(0,0,0);
if(flag==0)
printf("NONE\n");
}
return 0;
}