递归拆分自然数

Posted mxzf0213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归拆分自然数相关的知识,希望对你有一定的参考价值。

【递归】拆分自然数

题目描述

“天下熙熙,皆为利来;天下攘攘,皆为利往”,监狱里的暗势力划分地盘的目的无非是为了获取利益,他们分配利益的方式是基于这样一个准则:设总利益为自然数N,则任何一个大于1的N,总可以拆分成若干个小于N的自然数之和,求出N的所有拆分后选择最合适的一种进行分配,例如当N=3时,有两种划分,即3=1+2和3=1+1+1。试求出N的所有拆分。

输入

一个整数即N,N<100。

输出

输出每一种划分方案,每种划分方案占一行,最后一行为方案总数。

样例输入

3

样例输出

3=1+1+1
3=1+2
2

分析:按序递归即可;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e2+10;
const int dis[][2]={0,1,-1,0,0,-1,1,0};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
ll cnt;int n,a[maxn];
void dfs(int num,int now,int all)
{
    if(num==0&&all!=1)
    {
        cnt++;
        printf("%d=%d",n,a[0]);
        for(int i=1;i<all;i++)printf("+%d",a[i]);
        printf("\n");
    }
    else
    {
        for(int i=now;i<=num;i++)a[all]=i,dfs(num-i,i,all+1);
    }
}
int main()
{
    int i,j,m,k,t;
    scanf("%d",&n);
    dfs(n,1,0);
    printf("%lld\n",cnt);
    //system("pause");
    return 0;
}
 

 

 

以上是关于递归拆分自然数的主要内容,如果未能解决你的问题,请参考以下文章

回溯3--数的拆分

自然数的拆分(DFS)

Acwing-279-自然数拆分(背包)

递归算法之阶乘代码实现与非递归实现

为啥将拆分为 wav 文件的旋律转换为拆分的 mp3 会在片段边界处产生不好的声音?

pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”