整数划分问题
题目:
将正整数划分成一系列正整数的和:
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; }