整数划分问题递归算法

原创 2016年05月30日 10:52:29

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

算法04:整数划分递归算法

整数划分是指将正整数n划分成若干整数

将一个整数的每位数分解并按逆序放入一个数组中(要求用递归算法)

将一个整数的每位数分解并按逆序放入一个数组中(要求用递归算法)   /**  * @author sunxiao  * 将一个整数的每位数分解并按逆序放入一个数组中(要求用递归算法) ...
  • cynhafa
  • cynhafa
  • 2011年10月19日 11:11
  • 6025

递归算法(求年龄,阶乘,逆序输出字符串与整数,算两个数最大公约数等)

递归求年龄:        5个人坐在一起,问第5个人多少岁?他说比第四个人大2岁,第4个人比第3个人大2岁,第3个人比第2个人大2岁,第1个人为10岁,问第五个人多大? #include usin...
  • boxyuan
  • boxyuan
  • 2017年02月24日 11:36
  • 164

递归算法(求n的加法组合,将一个整数拆分成多个整数相加的形式, O(N)时间,O(N)空间)4.0版

网上的多种解法比较复杂,本文用递归方法,22行代码搞定。时间和空间复杂度已经降到最低!   //n give the sum of a list,and start give the first nu...

N后问题递归算法

  • 2013年12月25日 21:55
  • 450KB
  • 下载

汉诺塔问题的非递归算法

  • 2008年10月24日 21:50
  • 41KB
  • 下载

整数划分问题算法分析与实现(递归)

把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。 把一个正整数n写成为 n=m1+m2+…+mi。其中,mi为正整数,并且1≤mi≤n;{m1,m...

用C++写的皇后问题的递归算法

  • 2009年04月24日 20:45
  • 998B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:整数划分问题递归算法
举报原因:
原因补充:

(最多只允许输入30个字)