从放苹果问题想到的

来源:互联网 发布:2016年新网络大型游戏 编辑:程序博客网 时间:2024/05/17 01:18


    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) 5,1,1和1,5,1 是同一种分法。这个题目等同于 M个非负整数之和为N,问有多少组不同组合。
    这个其实是组合数学中的剖分。
    称(m1,m2,……,mk)为正整数n的一个剖分,如果m1,m2,……,mk是正整数,n=m1+m2+…+mk,并且n>=m1>=m2>=…>=mk>0,(也就是每个子集均为非空子集),其中mi成为此剖分的项,k为剖分的项数。不同的剖分个数称为剖分数。
    
    剖分的主要性质:
              1)把n拆分成不多于k项的剖分数等于把n拆分成最大项不超过k的剖分数。
        2)把n拆分成最大项为k的剖分数等于把n拆分成k项的剖分数。
        3)把n拆分成互不相同的若干奇数项的剖分数等于把n拆分成有自共轭Ferrer图             像的剖分数。
              4)设P(m,n)是把n拆分成各项属于{1,2,…,m}的剖分数,则{P(m,n)}的生成函数是

                                              

              把n拆分成各项属于{1,2,…,m},且m至少出现一次,其剖分数生成函数是

                            

              即P(m,n)-P(m-1,n)。

              5)设P(n)是n的剖分数,则序列{P(n)}的生成函数是

                                              

    若各项次序不同认为是不同的剖分,则把n拆分成r块的剖分数是组合C(n-1,r-1)。如7拆分成4块,其不同的剖分有以下C(6,3)=20种。

                                          

    注意上述情况中,子集均为非空集。

    再来看分苹果的题目,题目是允许出现空集的情况,相当于把M拆分为不多于N项的剖分数。因此可以利用性质1,转化一下,即M拆分为最大项不大于N的剖分数。由此可以得到递推式

                                    P(M,N)=P(M,N-1)+P(M-N,N)

    解释一下这个递推式,我们把P(M,N)的剖分分为两类,一类是划分的每一块都小于N的这种剖分,他有P(M,N-1)个;另一类是在划分中至少有一块是N的这种剖分。因为在划分中至少有一块是N,所以问题就变成M-N的每一块小于或等于N的剖分,这种剖分有P(M-N,N)个。

   因此由此递推式就可以DP解决这一类问题。当然需要定义好P(M,N)中,M=0或N=0,N=1 或M<N等几种情况。

 

从上述剖分的描述中,这类题目也可以通过生成函数求解。

                          

该生成函数通过级数展开,x的n次幂的系数即为要求的组合数。

 

如果题目中的盘子是不相同的,那就等同于求 x1+x2+…+xn=M 的非负整数解的个数。可以用挡板法求解。其实相当于在M个相同的球中插入N-1个相同的挡板。因此组合数

t = (M+N-1)! / ( M! * (N-1)! ) = C(M+N-1,M),即为不同解个数。

 


原创粉丝点击