前言: n个球,n 个袋子,看似简单,但是有不同问法以及相应的解法。
问题一:将n个相同的球放到m个不同的袋子里有多少种方案?
解答:(因为球相同,所以只是关注袋子里球的个数即可)
-
题外话:
课堂上讲的是隔板法,我认为这个方法有点儿不太贴切,如果把题目加上一个条件即每个袋子不为空,则隔板法名副其实。若加上这个条件,则可以这样做,即相当于将n个球排列成一排,这样n个球中间会有n-1个空隙,这样可以将 m 个袋子放进这 n-1 个空隙中,所以答案为 C n − 1 m C_{n-1}^m Cn−1m。
-
主线:
有了题外话的思路我们可以顺着此思路,但存在一个问题是当一个袋子可以为空的话,无论怎么把球隔开都不能满足条件。所以解决思路虽然与隔板法相似,但我认为用选取法更容易理解。即将n + m - 1 个东西摆成一排,从中选取 m-1 个东西当作袋子。
为什么不是 n+m个东西中选m个袋子呢?因为只要选取 m - 1 个袋子(选的这个袋子与前一个袋子之间的球就认定要放进这个袋子),这样一排摆 n + m -1个的原因也不言而喻了。所以答案就是 C n + m − 1 m − 1 C_{n+m-1}^{m-1} Cn+m−1m−1。
问题二:将n个不同的球放到m个不同的袋子里有多少种方案?
解答:(因为都不同,所以任何一种方法都不同)
没什么可说的,直接输出 m n m^n mn即可。
问题三:将n个不同的球放到m个相同的袋子里有多少种方案?
解答:(因为球不同,袋子相同,所以除了数量以为,球之间的组合关系也要考虑在内)
- 用f[i][j]表示将i个不同的球放到j个相同的袋子,并保证每个袋子里都有球的方案数。
- 考虑第i个球是不是单独放的。
- f[i][j]=f[i-1][j-1]+f[i-1][j]*j。
- 答案是f[n][0]+f[n][1]+…+f[n][m]。
- 时间复杂度O(nm)