整数划分问题

来源:互联网 发布:腾讯电脑软件管家 编辑:程序博客网 时间:2024/06/03 18:05

题目:

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

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 的划分,此时划分数为p(n,m-1)

故p(n,m)=p(n,m-1)+p(n-m,m)

当m = n时,可以分为两类

n1 = n ,只有1种

n1 < n,种数为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;

}

 


0 0