1. 球相同,盒不同,无空盒
因为球是相同的,所以我们只需要把球挨个放在一排进行选择就行了
我们发现,如果我们在某两个元素中间放一块板子来将其隔开:
这样一来,我们塞一个板子就可以得到 2 2 2 个集合,要有 m m m 个集合,就需要塞 m − 1 m-1 m−1 个板子 ,而在 n n n 的元素只有 n − 1 n-1 n−1 个空隙拿来塞板子,所以原问题转化为:求在 n − 1 n-1 n−1 个位置中塞 m − 1 m-1 m−1 个板子的组合数(因为盒子相同,所以是组合数),即 C n − 1 m − 1 C_{n-1}^{m-1} Cn−1m−1
2. 球相同,盒不同,可空盒
基本思想与球相同,盒不同,无空盒
情况相同,但是比较抽象:我们需要一种空球
就是这个样子:
假设有 m m m 个盒子,我们就再另外准备 m m m 个空球,这样,就可以出现空盒的情况(在一个盒子里只塞空球)。
这样一来,问题就成了:
有 n + m n+m n+m 个相同的球和 m m m 个不同的盒子,在无空盒的情况下,有几种放法?
问题就成了球相同,盒不同,无空盒
,套公式,最终答案为
C
n
+
m
−
1
m
−
1
C_{n+m-1}^{m-1}
Cn+m−1m−1
3. 球不同,盒相同,无空盒
对于这种问题,和第二类斯特林数有着很大的关系。因为第二类斯特林数就是求这种问题的方案总数
这里,我们采用dp来解决这一类问题
定义状态:
dp[i][j]
表示前
i
i
i 个球放入
j
j
j 个盒子的方案总数(这里注意一个细节:由于盒子是相同的,所以,定义状态的描述是放入j个盒子
,而不是放入前j个盒子
)
先给状态转移方程式:
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + j × d p [ i − 1 ] [ j ] dp[\ i\ ][\ j\ ]=dp[\ i-1\ ][\ j-1\ ]+j\times dp[\ i-1\ ][\ j\ ] dp[ i ][ j ]=dp[ i−1 ][ j−1 ]+j×dp[ i−1 ][ j ]
解释一下:
假设我们当前要放入 i i i 号球,那么,有两种放入方法
- 这个球单独占了一个盒子
- 这个球与前 i − 1 i-1 i−1 个球共占 j j j 个盒子
对于情况
1
1
1,其对应的结果就是dp[i-1][j-1]
对于情况
2
2
2,其对应的结果就是j*dp[i-1][j]
为什么要*j
呢?由于球是不相同的,而且有
j
j
j 个盒子可供选择,所以,根据乘法原理,我们需要*j
最终答案存储在dp[n][m]
4. 球不同,盒相同,可空盒
与球不同,盒相同,无空盒
基本类似,但是,由于可空盒,这就意味着,无论你是放
1
1
1 个盒子还是
2
2
2 个盒子,都是合法的,所以,在 球不同,盒相同,无空盒
的dp基础上,最终答案为:
∑
i
=
1
m
d
p
[
n
]
[
i
]
\sum\limits_{i=1}^mdp[\ n\ ][\ i\ ]
i=1∑mdp[ n ][ i ]
5. 球不同,盒不同,无空盒
我们来回忆一下球不同,盒相同,无空盒
的情况
思考:如果我们先把小球放进盒子之后,在对盒子进行一个全排列的排序,那么,在盒相同
的情况下,这样是没有意义的,因为这样的到的答案本质上是相同的,但是,在盒不同
的情况下,这样得到的答案本质上是不同的(因为盒子排序的过程就相当于把盒子内的小球进行集体迁移,由于盒不同,所以得到的方法必然是不同的)
那么,在 球不同,盒相同,无空盒
的dp基础上,最终答案为:dp[n][m]*(m!)
6. 球不同,盒不同,可空盒
这东西就是一个㵘淼沝水
由于球和盒子都是不同的,还允许空盒,所以,直接一个乘法原理,就得到了答案: m n m^n mn
7. 球相同,盒相同,无空盒
由于盒相同,所以,我们就假设左边的盒子里的球一定小于等于右边盒子里的球
就是这样:
考虑dp
定义状态:
dp[n][m]
表示将
n
n
n 个球放入
m
m
m 个盒子里的方案总数
由于不能有空盒存在,所以,我们可以先给每一个盒子放一个球
此时,我们还剩下 n − m n-m n−m 个球
剩下的球我们只能放在前
i
(
1
≤
i
≤
m
)
i(1\le i\le m)
i(1≤i≤m) 个盒子里(为了保证先前的假设成立),相当于dp[n-m][i]
综上,得到了状态转移方程式:
d p [ i ] [ j ] = ∑ k = 1 j d p [ i − j ] [ k ] dp[\ i\ ][\ j\ ]=\sum\limits_{k=1}^jdp[\ i-j\ ][\ k\ ] dp[ i ][ j ]=k=1∑jdp[ i−j ][ k ]
边界比较复杂:
d p [ i ] [ j ] = { 1 j = 1 or i = j 0 i < j dp[\ i\ ][\ j\ ]=\begin{cases}1&j=1\ \operatorname{or}\ i=j\\0&i<j\end{cases} dp[ i ][ j ]={10j=1 or i=ji<j
最终答案为dp[n][m]
8. 球相同,盒相同,可空盒
和球相同,盒相同,无空盒
的情况类似,但是,需要借鉴一下球相同,盒不同,可空盒
的空球思想
我们在另外准备 m m m 个空球,和原有的 n n n 个球放在一起
这样,问题就变成了球相同,盒相同,无空盒
,在原dp基础上,最终答案为dp[n+m][m]