洛谷 P2404 自然数的拆分问题

题目链接

https://www.luogu.org/problemnew/show/P2404


题目背景

木有......


题目描述

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


输入输出格式

输入格式:

输入:待拆分的自然数n。

输出格式:

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


思路

用搜索和回溯做吧......比那个输出素数环还要简单的啦
这道题属于回溯的一道板子题,还是比较好做的
可以一路搜到底得到一种方案,然后在这次的方案排列完毕后,回溯,继续搜索下一方案


代码

#include<bits/stdc++.h>
using namespace std;

int a[10086]= {1};
int n,total;
int search(int,int);
int print(int);

int main() {
    scanf("%d",&n);
    search(n,1);
    return 0;
}

int search(int s,int t) {
    for(int i=a[t-1]; i<=s; i++) {
        if(i<n) {
            a[t]=i;
            s-=i;
            if(s==0)print(t);
            else search(s,t+1);
            s+=i;
        }
    }
}

int print(int t) {
    for(int i=1; i<=t-1; i++) {
        cout<<a[i]<<"+";
    }
    cout<<a[t]<<endl;
}

猜你喜欢

转载自www.cnblogs.com/loceaner/p/10712781.html