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

简介: 来自:http://blog.csdn.net/qq675927952/article/details/6312255   问题1: m----->相同, n---> 相同,可为空 将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的全排列。

 

相关文章
|
8月前
|
存储
leetcode-1705:吃苹果的最大数目
leetcode-1705:吃苹果的最大数目
67 0
poj 1164 放苹果
这题可以用递归的方式做,想给第一个盘子里放上苹果从(0到m),然后给第二个放上,为了保证每次产生的放法是不同的,第二个里面放置的苹果不能从0开始,否则就会产生相同的放法,然后同理第三第四个盘子。。。。 还有一个问题,可能放到最后一个盘子了,还有很多苹果没有放,怎么办?
53 0
m个苹果放在n个盘子里面有多少种放法?(动态规划)
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
854 0
|
C语言
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
初学算法之递归---放苹果
初学算法之递归---放苹果
每日一题1217:换位置
题目描述: M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。
188 0
|
人工智能
UPC——放牛奶的冰箱(二分法)
题目描述 冬冬在古子城购买了一台冰箱,冰箱内部可以表示为高度为h,深度为1,宽度为2的矩阵,最初冰箱底部只有一个架子,但冬冬可以在任何一个格子顶部放隔板,隔板的宽为2,不占用任何空间,将冰箱内部分隔成上、下两部分。 冬冬有n瓶牛奶要按顺序放入冰箱里。第i瓶牛奶的高度是ai,深度和宽度均为1。如果架子上方的相应空间至少与瓶子一样高,他可以在一个架子上放一瓶牛奶,他不能将两瓶牛奶叠在一起(如果它们之间没有架子)。
158 0
UPC——放牛奶的冰箱(二分法)