整数划分问题

题目:将正整数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))

 


  

posted on 2017-09-08 17:56  我是蒟蒻  阅读(173)  评论(0编辑  收藏  举报

导航