题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1258
思路:搜索DFS
注意:搜索过程中,为了避免重复输出,需要记录前一层搜索的起点,下一层递归搜索的起点
不能与前一层记录的点一样
#include<stdio.h>
#include<string.h>
int a[103],b[103],n,m;
bool v[103],flag;
void dfs(int sum,int pos,int ans)
{
int i;
if(sum==n)
{
flag=true;
for(i=1;i<=ans;i++)
printf(i==ans?"%d\n":"%d+",b[i]);
return;
}
int last=-1;
for(i=pos+1;i<=m;i++)
{
if(!v[i]&&last!=a[i])//(last!=a[i])当前不能跟上一次搜索的起点一样,会造成重复
{
last=a[i]; //last保存当前搜索的起点
v[i]=true;
b[ans+1]=a[i];
dfs(sum+a[i],i,ans+1);
v[i]=false;
}
}
}
int main()
{
int i;
while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
{
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
memset(v,false,sizeof(v));
flag=false;
printf("Sums of %d:\n",n);
dfs(0,0,0);
if(!flag) printf("NONE\n");
}
return 0;
}