DFS的练习,当数字大于和时进行剪枝。这题的关键在于过滤掉之前DFS过的值,这里采用的是记录上一个阶段使用的值,并与当前的值进行比较,不相等才能进行DFS
#include<iostream>
using namespace std;
int num[20],s[20],n,m,flag;
void dfs(int x,int cnt,int z){
int d;
if(z > n) return ;
if(z == n){
flag = 1;
for(int i = 0;i<cnt;i++){
if(i == cnt-1)
printf("%d\n",s[i]);
else printf("%d+",s[i]);
}
}
d = -1;
for(int i = x;i<m;i++){
if(num[i] != d){
s[cnt] = num[i];
d = num[i];
dfs(i+1,cnt+1,z+num[i]);
}
}
return ;
}
int main(){
while(scanf("%d %d",&n,&m),n,m){
for(int i = 0;i<m;i++)
scanf("%d",&num[i]);
printf("Sums of %d:\n",n);
flag = 0;
dfs(0,0,0);
if(!flag)
printf("NONE\n");
}
return 0;
}