zoukankan      html  css  js  c++  java
  • 整数划分问题

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


      

  • 相关阅读:
    nginx之location、rewrite配置
    nio buffer
    分布式事务
    彻底剖析RMI底层源码 、手写轻量级RMI框架
    Java RMI详解
    Java提高篇——对象克隆(复制)
    序列化
    分布式通信-tcp/ip 广播
    分布式通信-tcp/ip 单播
    php 图像处理 抠图,生成背景透明png 图片
  • 原文地址:https://www.cnblogs.com/iamjuruo/p/7495799.html
Copyright © 2011-2022 走看看