自然数拆分-回溯

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式

待拆分的自然数n。

输出格式

输出:若干数的加法式子。

输入输出样例

7

7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4

题解

#include <bits/stdc++.h>
using namespace std;
int b,r,n,a[1001]={1},s;
int print(int k){
    printf("%d=",n);
    for(int i=1;i<=k-1;i++)
    {
        
        printf("%d",a[i]);
        printf("+");
    }
    printf("%d
",a[k]);
    return true;
}
int search(int s,int h)
{
    for(int i=a[h-1];i<=s;i++)
    {
        if(i<n&&i=k)//这里用n,不用s 
        {
            a[h]=i;
            s=s-i;
            if(s==0)
            {
                print(h);
            }
            else{
                search(s,h+1);
                s=s+i;//加上拆分的数,以便产生所有的可能拆分 
                //如果不加回来,无法回溯
            }
        }    
        
    }
}

int main()
{
    scanf("%d",&n);
    search(n,1);
    return 0;
}
原文地址:https://www.cnblogs.com/TheZealous/p/14301350.html