题目:
将正整数划分成一系列正整数的和:
N = n1 + n2 + n3 +n4 + ...+nk ( n1>=n2>=n3...>=nk>=1,k=1)。
正整数的这种表示称为正整数的一种划分。
正整数n的不同的划分数称为n的划分数,记作p(n)。
给定n,求p(n)。
分析:
对给定的n的不同划分,n1一定是小于等于n。因此可以确定 n1的范围为1≤ n1 ≤ n。
为方便讨论n1取某个取值时的划分数,定义n1不大于m时n的划分数为p(n,m)。
当m=1时,
n只能被分成n个1,故p(n,1)=1
当m < n时,n的划分有两类:
n1 = m的划分,此时划分数等于n-m的划分,即p(n-m,m)
n1 < m 的划分,即划分的数字中都比m小,因此应该是n1 <= m-1,此时划分数为p(n,m-1)
故p(n,m)=p(n,m-1)+p(n-m,m)
当m = n时,可以分为两类
n1 = n ,只有1种
n1 < n,即n1 <= n-1 ,种数为p(n,n-1)
代码:
#include<stdio.h>
int p(int n,int m) {
if(m== 1)
return 1;
if(m< n)
return p(n,m-1)+p(n-m,m);
if(m== n)
return 1 + p(n,n-1);
if(m> n)
return p(n,n);
}
int main() {
int n;
scanf("%d",&n);
printf("%d\n",p(n,n));
return 0;
}