整数划分问题
整数划分问题
问题描述:
将正整数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;
}
运行截图: