整数划分问题
题目:将正整数n表示成一系列正整数之和,n=n1+n2+...+n3 (其中,n1>=n2>=n3..>=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
我们可以这样考虑:
p(n,n1) 表示在n中最大加数<=n1
当 n1=n时 只有一种表示,即 n=n p(n,n1)=1+p(n,n1-1)
可以分为两种情况n=n1 此时只有一种划分
n1<n 此时有 p(n,n-1)种划分
当n1>n时 p(n,n1)=p(n,n)
正常思考的话这种情况是不可能存在的,但是它在n1<n时有用
当n1<n时 p(n,n1)=p(n-n1,n1)+p(n,n1-1)
可以把p(n,n1)分解成 当最大加数等于n1的情况和最大加数小于n1的情况
当最大加数等于n1时为 p(n-n1,n1)
当最大加数小于n1时,p(n,n1-1)
当n1=1时 p(n,n1)=1
当n=1时 p(n,n1)=1
当n=0时 为0
当n1=0时 为0
源代码如下:
def p(n,n1): if n1==1 or n==1: return 1 if n1==0 or n==0 return 0 elif n1==n: return p(n,n1-1)+1 elif n<n1: return p(n,n) else: return p(n-n1,n1)+p(n,n1-1) print(p(6,6))