题意:首先给你一个t,然后是n,后面输入n个数(是非递增顺序的,亲~要注意一下哦),然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来。
思路:深搜思想,最重要的是如何避免重复的序列(详见代码)
代码实现:
#include<iostream> #include<cstring> using namespace std; int sum,n,a[20],b[20],s,flag; void dfs(int f,int num)//深搜 { int i,visited[101]; if(s==sum) //满足题意就输出来 { flag=0; for(i=0;i<num-1;i++) printf("%d+",b[i]); printf("%d\n",b[num-1]); } else { memset(visited,0,sizeof(visited)); //visited数组是用来避免重复的,这是精髓 for(i=f;i<n;i++) { if(visited[a[i]]==0&&(s+a[i]<=sum)) { visited[a[i]]=-1; s=s+a[i]; b[num++]=a[i]; dfs(i+1,num); s=s-a[i]; num--; } } } } int main() { int i; while(scanf("%d%d",&sum,&n)!=EOF&&(sum||n)) { flag=1; printf("Sums of %d:\n",sum); for(i=0;i<n;i++) scanf("%d",&a[i]); s=0; dfs(0,0); if(flag) printf("NONE\n"); } return 0; }