i喝水的鱼的博客

起风了,唯有努力生存

整数划分问题递归算法

将整数n表示成一系列正整数之和

n=n1+n2+......+nk  (其中,n1≥n2≥......≥nk≥1,k≥1)

正整数n的这种表示称为正整数n的划分。正整数n的不同的划分个数称为正整数n的划分,记作p(n)。例如p(6)=11。

在正整数n的所有的不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。

(1)q(n,1)=1,n≥1

当最大加数n1不大于1时,任何正整数n只有一种划分形式,即n=1+1+...1(n个1相加)。

(2)q(n,m)=q(n,n),m≥n

最大加数n1实际上不能大于n。因此q(1,m)=1。

(3)q(n,n)=q(n,n-1)+1,

正整数n的划分由n1=n的划分和n1≤n-1的划分组成。

(4)q(n,m)=q(n,m-1)+q(n-m,m),n>m>1

正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1的划分组成。

以上关系实际上给出了计算q(n,m)的递归试如下:

  

据此,可设计计算q(n,m)的递归函数如下。整数n的划分数p(n)=q(n,n)。

#include<stdio.h>
#include<iostream.h>
//using namespace std;
int q(int n,int m)
{
	if((n==1)||(m==1)) 
			return 1;
	else if(n<m) 
			return q(n,n);
	else if(n==m) 
			return q(n,m-1)+1;
	else 
		return q(n,m-1)+q(n-m,m);
}
int main()
{
	int x;
	cin>>x;
	printf("%d\n",q(x,x));
	return 0;
}




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31917401/article/details/51536311
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

整数划分问题递归算法

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭