• 将m个苹果放入n个盘子的问题【转】


    来自:http://blog.csdn.net/qq675927952/article/details/6312255

    问题1:

    m----->相同, n---> 相同,可为空

    将m个苹果放进n个盘子中,盘子允许空,有多少种方法。同时注意例如1、2和2、1这两种方案是一种方案。

    思路:

    其实这跟将一个整数m分成n个整数之和是类似的,

    设f[m][n]为将m分成最多n份的方案数,且其中的方案不重复,每个方案前一个份的值一定不会比后面的大。

    则有:f[m][n] = f[m][n - 1] + f[m - n][n];   
             = 1 // m== 0 || n == 1      
           = 0 // m < 0

    f[m][n - 1]相当于第一盘子中为0,只用将数分成n - 1份即可。
    因为0不会大于任何数,相当于f[m][n - 1]中的方案前面加一个为0的盘子,
    而且不违背f的定义。所以f[m][n - 1]一定是f[m][n]的方案的一部分,即含有0的方案数。
    f[m - n][n]相当于在每个盘子中加一个数1。因为每个盘子中加一个数1不会影响f[m][n - 1]中的方案的可行性,也不会影响f的定义。
    所以f[m - n][n]一定是f[m][n]的方案的一部分,即不含有0的方案数。

    问题2:

    问题描述:将整数N分成K个整数的和 且每个数大于等于A   
    小于等于B 求有多少种分法

     1 int Dynamics(int n, int k, int min) //将n分为k个整数 最小的大于等于min,最大不超过B 
     2 {
     3 
     4     if(n < min) return 0;//当剩下的 比min小,则不符合要求 返回0 
     5     if(k == 1) return 1;  
     6     int sum = 0;
     7     for(int t = min; t <= B; t++)
     8     {
     9      sum += Dynamics(n-t, k-1, t);
    10     }
    11     return  sum;
    12 
    13 }

    问题3:

    m----->相同, n---> 相同,不能为空

    将m个苹果放进n个盘子中,有多少种方法。同时注意例如1、2和2、1这两种方案是一种方案。

    思路:

    先把每个都放一个苹果,这样问题就转化为:m-n个苹果放进n个盘子里,盘子允许空,即问题1

    问题4:

    第一类Stirling数是有正负的,其绝对值是包含n个元素的集合分作k个环排列的方法数目

    递推公式为,
    S(n,0) = 0, S(1,1) = 1.
    S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。

    n个元素的集合分作k个环排列的方法是s(n,k),那么

    1.可由前n-1个元素k-1个环的s(n-1,k-1); 即最后一个元素为单环,前n-1个构成k-1环;

    2.第n个元素一定不是单环,可以由n-1个元素k个环,把第n个数任意的放入一个环中组成新环!即得到n个

    元素的集合分作k个环,假设n个元素的集合分作k个环,那么由于n,不在单环中,那么可以把n所在的环中把n

    剔除,即得到了n-1个元素,k个环,即充分与必要性都得证!

    因而:S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。得证!

    问题5:

    第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。
    //n->有区别,K->非空,没区别
    递推公式为,
    S(n,n) = S(n,1) = 1,
    S(n,k) = S(n-1,k-1) + kS(n-1,k).


    上面的递推式可以用组合证明:
    一方面,如果将第n个元素单独拿出来划分成1个集合,那么方法数是S(n-1,k-1);
    另一方面,如果第n个元素所在的集合不止一个元素,那么可以先将剩下的n-1个元素划分好了以后再选一个集合把第n个元素放进去,方法数是k*S(n-1,k);
    有加法原理得证

    问题6:

    Bell数和Stirling数

    B(n)是包含n个元素的集合的划分方法的数目。

    集合的划分:非空,

    B(0) = 1, B(1) = 1,

    B(n) = Sum(1,n) S(n,k).  其中Sum(1,n)表示对k从1到n求和,

    问题7:

    当K是有区别的时候,则一般都要在没有区别的基础上乘以K的全排列。

  • 相关阅读:
    [爬虫资源]各大爬虫资源大汇总,做我们自己的awesome系列
    [Nancy On .Net Core Docker] 轻量级的web框架
    2015,平凡之路
    转[开发环境配置]在Ubuntu下配置舒服的Python开发环境
    转自coolshell--vim的基本操作
    [python基础]关于包,类,模块的那些事儿
    [python IDE] 舒服的pycharm设置
    [python基础]关于中文编码和解码那点事儿
    [python基础]关于装饰器
    小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/4036425.html
Copyright © 2020-2023  润新知