关闭

整数划分问题递归算法

282人阅读 评论(0) 收藏 举报
分类:

将整数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;
}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:525次
    • 积分:43
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档