递归拆分自然数
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; }
以上是关于递归拆分自然数的主要内容,如果未能解决你的问题,请参考以下文章