一道搜索题,关键是不能有重复的出现。。。
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 int t,n,flag; 6 int num[14],save[14]; 7 8 int cmp(const void *a,const void *b){ 9 return (*(int *)a)>(*(int *)b); 10 } 11 12 void dfs(int i,int sum,int count){ 13 if(sum>t) 14 return ; 15 if(sum==t){ 16 for(int j=0;j<count-1;j++){ 17 printf("%d+",save[j]); 18 } 19 printf("%d\n",save[count-1]); 20 flag=1; 21 return; 22 } 23 int tag=-1; 24 for(int k=i;k<n;k++){ 25 if(num[k]!=tag){ 26 save[count]=num[k]; 27 sum+=num[k]; //每次的和 28 tag=num[k]; //保留当前的数,能避免重复 29 dfs(k+1,sum,count+1); 30 sum-=num[k]; 31 } 32 } 33 } 34 35 int main(){ 36 while(scanf("%d%d",&t,&n)!=EOF){ 37 if(n==0)break; 38 for(int i=0;i<n;i++){ 39 scanf("%d",&num[i]); 40 } 41 qsort(num,0,sizeof(num[0]),cmp); 42 printf("Sums of %d:\n",t); 43 dfs(0,0,0); 44 if(!flag){ 45 printf("NONE\n"); 46 } 47 flag=0; 48 } 49 return 0; 50 }