整数划分问题

 

 

整数划分问题

 

 

问题描述:

 

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

n=n1+n2+n3+n4+...+nk,

其中n1>=n2>=n3>=n4>=...>=nk>=1,k>=1,

正整数n的这种表示称为正整数n的划分。

 

正整数n的不同划分个数称为正整数n的划分数,记作 p(n)。

 

 

例如,正整数6有如下11种不同的划分,所以 p(6)=11

 

6;

5+1;

4+2,4+1+1;

3+3,3+2+1,3+1+1+1;

2+2+2,2+2+1+1,2+1+1+1+1;

1+1+1+1+1+1;

  

 

解题思路:

 

在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记作 q(n,m)

 

n就是要划分的整数,m就是划分过程中出现的最大加数

 

 

(1)当 n=1时,q(1,m)=1

此时要划分的整数为1,实际上m的值是小于等于n的,所以此时q(1,m)=q(1,1)=1

 

(2)当 m=1时,q(n,1)=1

此时划分过程中的最大加数为1,即 n 个 1 相加

 

(3)当 n<=m 时,q(n,m)=q(n,n)

此时也是划分过程中,实际上m是小于等于n的

 

(4)当 n=m时,q(n,m)=q(n,n)=1+q(n,n-1)

 

(5)当 n>m>1时,q(n,m)=q(n,m-1)+q(n-m,m)

 

 

可以根据以上的关系给出计算q(n,m)的递归公式:

 

 

测试代码:

#include<iostream>
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,n-1) + 1;
	else return q(n,m-1)+q(n-m,m);
}

int main()
{
	int n;
	cin>>n;
	int sum=q(n,n);
	cout<<sum<<endl;
	return 0;
}

  

运行截图:

 

 

 

 

 

  

posted @ 2020-12-30 17:10  CannedDream  阅读(386)  评论(0编辑  收藏  举报