zoukankan      html  css  js  c++  java
  • 整数划分问题之递归法

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:

        n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。

    如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);

    例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};

    注意4=1+3 和 4=3+1被认为是同一个划分。

    该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m)的方法;

    分析:

    我们可以分为四种:

    1. m=1 or n=1

    只有一种划分情况,就是n个1相加, 所以f(n,m)=1;

    2. m=n>1

    f(n,m)=f(n,n-1)+1  加上的1代表n+0=n这个划分方案

    3.n<m

    f(n,m)=f(n,n) 逻辑上不存在m>n这种情况

    4.n>m

    f(n,m)=f(n,m-1)+f(n-m,m)

    f(n,m-1)表示划分方案中没有m的情况

    f(n-m,m)表示划分方案中有m的情况

    下面我们来看一个例子,可以更好的理解哦

    整数4 最大加数 3
    1+3=4
    1+1+2=4
    2+2=4
    1+1+1+1=4
    一共4种划分方案

    分析:

    没有m的情况:

    1+1+2=4
    2+2=4
    1+1+1+1=4

    符合f(n,m-1)

    有m的情况:

    1+3=4

    符合f(n-m,m)

    代码如下:

    /*
    整数划分问题
    :将一个整数划分为若干个数相加
    例子:
    整数4 最大加数 4
    4=4
    1+3=4
    1+1+2=4
    2+2=4
    1+1+1+1=4
    一共五种划分方案
    注意:1+3=4,3+1=4被认为是同一种划分方案
    */
    
    #include<stdio.h>
    int q(int n,int m)//n表示需要划分的数字,m表示最大的家数不超过m
    {
        if(m==1||n==1)//只要存在一个为1,那么划分的方法数肯定只有一种,那就是n个1相加
        {
            return 1;
        }else if(n==m&&n>1)//二者相等且大于1的时候,问题等价于:q(n,n-1)+1;意味着将最大加数减一之后n的划分数,然后加一,最后面那个一代表的是:0+n,这个划分的方案
        {
            return q(n,n-1)+1;
        }else if(n<m)//如果m>n,那么令m=n就ok,因为最大加数在逻辑上不可能超过n
        {
            return q(n,n);
        }else if(n>m)
        {
            return q(n,m-1)+q(n-m,m);//分为两种:划分方案没有m的情况+划分方案有m的情况
        }
        return 0;
    }
    int main()
    {
        printf("请输入需要划分的数字和最大家数:
    ");
        int n,m;
        scanf("%d %d",&n,&m);
        int r=q(n,m);
        printf("%d
    ",r);
        return 0;
    }

    技术在于分享

  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/yinbiao/p/8672198.html
Copyright © 2011-2022 走看看