3588 - 自然数有序拆分

通过次数

0

提交次数

0

时间限制 : 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);
}