T3——拆分自然数
#include<iostream> #include<cstdio> using namespace std; int a[105];//以数组的的形式记录拆分,便于接下来的搜索与回溯 bool b[100]={0}; int n; int tot=0; void search(int,int); void print(int); int main(void) { freopen("Distribution.in","r",stdin); freopen("Distribution.out","w",stdout); scanf("%d",&n); search(1,n); printf("%d",tot); } void print(int g)//输出函数 // { printf("%d=",n); cout<<a[1]; for(int i=2;i<=g;i++) printf("+%d",a[i]); cout<<'\n'; } void search(int x,int y)//search表示我们在小于 y 的范围内选取第 x 个数字 //选取数字规则按照字典序 //所以我们优先选小的数字 每个数字必须小于或者等于前一个数字 //依次递归可得 //当我们选取当前数字之后将y的范围缩小防止 //以后与我们之前选择的数列重复 //之后输出方案数++ { for(int i=1;i<=n;i++) { if(i==n) break; if(i>=a[x-1]&&i<=y) { a[x]=i; if(y-i==0) print(x),tot++/*Copy(x,tot)*/; else search(x+1,y-i); } } }
-end-