算法设计与分析-整数划分问题
吕国英第3版课本p59,例题6
问题描述
举例:
对于正整数n=6,它可以分划为:
代码(codeblocks)
#include<iostream>
using namespace std;
int Divinteger(int n,int m)//划分n,n的任何加数都不超过m
{
if(n==1||m==1) return 1;//n=1或者m=1都只有1个分划
else if(n<m) return Divinteger(n,n);//当n<m时,将m换成n
else if(n==m) return 1+Divinteger(n,n-1);//1表示n只包含一个被加数等于n本身的分划;剩下的分划就是对n进行划分,最大加数为n-1
else return Divinteger(n,m-1)+Divinteger(n-m,m);//当n>m时:(n,m-1)是被加数不包含m的分划的数目;(n-m,m)是当确定了一个被分划的被加数中包含m时,剩下的部分就是对n-m进行不超过m的分划
}
int main()
{
int n;
cout<<"Please input the number you want to divide:";
cin>>n;
while(n<1)//限定被划分整数≥1
{
cout<<"Error!the number should be grater than 0!\nPlease re-enter:";
cin>>n;
}
cout<<"There are "<<Divinteger(n,n)<<" methods to divide this number.";
return 0;
}