前言
排列组合在算法求解中尤为重要,特别是对于方案数的求解,以及我们知道本质之后可以对其进行深入的挖掘。如 x + y = 4 x + y = 4 x+y=4,求解的数量,如果数据小,我们可以枚举,但是如果数据量大我们什么办呢?首先我们需要对这个问题进行抽象,把 x ,y 看成两个盒子,4看成有4个小球,那么这题就转换为了,将4个相同的球分配到2个盒子(允许有空盒)的方案数,那么就是 C ( 4 + 2 − 1 , 1 ) = 5 C(4 + 2 - 1,1) = 5 C(4+2−1,1)=5
一、隔板法
相同元素的分配问题
1、条件和直接用法
转变为在n-1个空隙中,放入k-1个板子的排列组合问题(k是盒子数量)
2、变式一,放入的个数不是1的时候而是m的时候什么办
我们以2个先来讲,因为隔板法都是1个,那么我们就可以先将m个球放入m个盒子里,这样剩余的球就又变成了隔板问题。相当于分解子问题,那么分出的m个球我们也利用隔板法 ,不过在这个例子是1,所以间隔数与隔板数一样因此就是1,剩余就是(n-m)个进行隔板法。
那如果是每一个盒子至少放k个了,在这里我们可以发现我们先放的数量就是和盒子要求的至少少一个是一样的,因此我们这一部分的发的方法都是1.
3、变式二,小球个数不是1,但是不都是一样的,如下
我们的做法如图还是先放一部分,让剩余的满足条件,那么这里就说一说,先放的为什么方法是1,我们可以都先放的再进行一次分割子问题,变成不小于编号-1的球,然后再将这几个球按照同样的方式先放一部分,最后我们发现,这样一直分,没一个部分的分的方法都是1按照乘法原理最后就是1了。
4、有空盒的情况
我们是借与盒子数量相同的球,然后再进行隔板法
二、分组分配法
1、分组
2、分组加分配
前一步是分组问题,后一步是分配问题,因此我们在解决的时候,先分组*分配