整数划分 蓝桥杯
指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。这是一个典型的递归算法。
分析:比如数字5分成3个整数的和,1+1+3,1+2+2,1+1+3,0+2+3,+1+4,
(一)当n=1时,无论m的值为多少(m>0),只有一种划分,即。
(二)当m=1的值为多少,只有一种划分,即n个1,
。
(三)当n=m时否包含n,可以分为以下两种情况:
(1)划分中包含n的情况,只有一个,即
。
(2)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有
划分。因此
。
代码:
#include<iostream>
using namespace std;
int equation(int n,int m){
if(m==1||n==1)
return (1);
else if(n<m)
return equation(n,n);
else if(m==n)
return 1+equation(n,n-1);
else
return equation(n-m,m)+equation(n,m-1);
}
int main(){
int m,n;
cin>>n>>m;
int Q;
Q=equation(n,m);
cout<<Q;
return 0;
}