放鸡蛋问题:相同元素分配到相同的空间
标签: C语言 放鸡蛋 相同元素 相同空间
by 小威威
1.引入
放鸡蛋问题就是指将相同元素分配到相同空间这一类问题。具体问题就是:现在有n个相同的鸡蛋,m个相同的篮子,将这n个鸡蛋分配到篮子中,且篮子可以为空,问一共有多少种分配方法?
我们的第一反应就是排列组合,而这一问题很类似于我们高中的隔板法。然而,如果你沿着这条思路,恐怕你就会走近进胡同却又浑然不知。
因为隔板法是针对相同元素分配到不同空间而设计的,注意,是不同空间。倘若篮子是不同的,那么就可以用隔板法来解决这一问题。而如今是相同篮子。也许你会说可以将结果除以某个组合数,但我是试过了,行不通,如果你能做到,欢迎在下面评论,或者私我,不胜感激。
但是,隔板法行不通并不意味着这道题和排列组合毫无关联,因为解这道题还是需要排列组合中的分类思想。
2.问题分析
现在有n个相同的鸡蛋,m个相同的篮子,将这n个鸡蛋分配到篮子中,且篮子可以为空,问一共有多少种分配方法?
拿到这道题,我们首先要进行第一次分类,也就是篮子数与鸡蛋数的大小关系。当鸡蛋数小于篮子数时,无论怎么放,都会有空篮子,并且篮子是相同的,不妨就将这几个篮子删去,即让篮子数等于鸡蛋数。此时,就能将鸡蛋数小于篮子数这一情况归于下面一种情况。当鸡蛋数大于等于篮子数时,此时要进行第二次分类:因为篮子可以为空,所以分为没有空篮子,一个空篮子,两个空篮子….最多可以有m-1个篮子。如此分类保证了除了空篮子以外,其他篮子至少要有一个鸡蛋,这样问题就容易分析多了。我们设F(m, n)为将n个鸡蛋分配到m个篮子,篮子可以为空,设T(m, n)为将n个鸡蛋分配到m个篮子,篮子不可以为空。则F(m, n)=T(m, n)+T(m,n-1)+T(m,n-2)+….+T(m, 1)。显然,要解出这一式子要用递归的思想。但对于这个式子,我们还需要变一下形,使F与T的联系更紧密。
对于1+2