整数划分问题

题目:

将正整数划分成一系列正整数的和:

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;
}


posted @ 2016-03-28 22:50  渐入佳境coder  阅读(145)  评论(0编辑  收藏  举报