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<<'
';
}
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-

原文地址:https://www.cnblogs.com/-Iris-/p/13073005.html