Problem Description
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
Input
输入有多组数据,对于每组数据就一个数n。
Output
对于每组输入输出n的拆分方法。
Sample Input
4
Sample Output
1+1+1+1 1+1+2 1+3 2+2
//深搜,回溯 #include<iostream> #include<cstdio> #include<malloc.h> int a[11111]={1}; int n; int fun(int t) { int i; for(i=1;i<=t-1;i++) printf("%d+",a[i]); printf("%d\n",a[t]); } int dfs(int m,int t) { int i; for(i=a[t-1];i<=m;i++) if(i<n) //当前数i要大于前一个数,但不大于n { a[t]=i; // 当前拆分的数i m-=i; // 减去已拆分的数,继续拆分 if(m==0) fun(t);// s=0, 输出结果 else dfs(m,t+1); //当s>0,继续 m+=i;// 回溯 加上已拆分的数,以便产生所有可能的拆分 } } int main() { int i,k,m; while(scanf("%d",&n)!=EOF) { //a=(int *)malloc(sizeof(int)*(n+1)); dfs(n,1); //free(a); } return 0; }