3588 - 自然数有序拆分
时间限制 : 1 秒
内存限制 : 128 MB
任何一个大于1的自然数总可以拆分成若干个自然数
之和。例如n=4,
4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
对于给定的自然数n(n<=100),求出它的所有拆分。
题目输入
输入一个自然数n,(n<50)
题目输出
输出所有拆分,每种不同的拆分输出在不同的行
输入/输出样例
输入格式
4
输出格式
1 1 1 1 1 1 2 1 3 2 2
C++解答
#include<cstdio> int a[101]; int n; void print(int k) { for(int i=1;i<k;i++) printf("%d ",a[i]); printf("%d\n",a[k]); } void go(int s,int k)//s表示是否加完,即与0相差多少;k表示当前是第k个数 { if(s==0) { print(k-1);//k的初始值为1,为了防止多输出一位,即用k-1 return; } for(int i=1;i<=s;i++) if(a[k-1]<=i&&i<n) { a[k]=i; s=s-i; go(s,k+1);//核心算法-回溯 s=s+a[k]; } } int main() { scanf("%d",&n); go(n,1); }