问题是什么
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:
n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),
则{m1,m2,...,mi}为n的一个划分。
如果{m1,m2,…,mi}中的最大值不超过m,即max(m1,m2,…,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);
代码如下
#include<iostream>
using namespace std;
int countg(int n,int m)
{
if(n==1||m==1)
return 1;
else if(n<m)
return countg(n,n);
else if(n==m)
return 1+countg(n,n-1);
else
return countg(n,m-1)+countg(n-m,m);
}
int main(void)
{
int n;
cout<<"输入待划分的整数:";
cin>>n;
cout<<"划分一共"<<countg(n,n)<<"种."<<endl;
system("pause");
return 0;
}