n个球放到m个盒子
以8个球放到3个盒子为例
1 球同,盒同,可空
思路一:8个球放到3个盒子
取球最少盒子取0个球,取球第二少的盒子取[0,4]
取球最少盒子取1个球,取球第二少的盒子取[1,3]
取球最少盒子取2个球,取球第二少的盒子取[2,3]
一共5+3+2=10种
类似于 整数拆分 包含0 非递减序
8 = 0 + 0 + 8
+ 1 + 7
+ 2 + 6
+ 3 + 5
8 = 1 + 1 + 6
+ 2 + 5
+ 3 + 4
8 = 2 + 2 + 4
+ 3 + 3
思路二:
有n个球,和m个盒子,我可以选择在所有盒子里面都放上1个球,也可以不选择这个操作,
如果选择了这个操作,那么就从dp[n-m][m]转移过来
如果没有选择这个操作,那么就从dp[n][m-1]转移过来
dp[n][m]:n个相同的球放入m个相同的盒子的放法
边界条件:
k个球放入一个盒子只有一种放法:dp[k][1] = 1
一个球放入k个盒子只有一种放法:dp[1][k]=1
没有球只有一种放法(都不放):dp[0][k]=1
状态转移方程:
dp[n][m] = dp[n][m-1] + dp[n-m][m] , n>=m
dp[n][m] = dp[n][m-1] , n<m
2 球同,盒同,不空
思路一:
8个相同的球放进3个相同的盒子里,每盒至少一个
取球最少的盒子取1个球,取球第二少的盒子可以取[1,3] 3种
取球最少的盒子取2个球,取球第二少的盒子可以取[2,3] 2种
取球最少的盒子取3个球,此情况不存在,一共5种
按取球多寡来分类讨论可以做到不遗漏,不重复
类似问题:整数拆分,非递减序
8 = 1 + 1 + 6
+ 2 + 5
+ 3 + 4
8 = 2 + 2 + 4
+ 3 + 3
思路二:
因为要求无空箱,我们先在每个箱子里面放1个球,然后还剩下n-m个球了,就转化成了情况1了
3 球不同,盒同,不空
思路一:
取球最少盒子取1个球时,有116,125,134三种情况,分别有C(8,6)=28, C(8,1)*C(7,2)=168, C(8,1)*C(7,3)=280
取球最少盒子取2个球时,有224,233二种情况,分别有C(8,2)*C(6,2)/2=210,C(8,3)*C(5,3)/2=280
一共28+168+280+210+280=966
思路二:第二类斯特林数
对于第n个球,
如果前面的 n-1 个球已经放在了 m 个箱子里,那么现在第 n 个球放在哪个箱子都是可以的,所以 m*dp[n-1][m]
如果前面的 n-1 个球已经放在了 m-1 个箱子里,那么现在第 n 个球必须要新开一个箱子来存放,所以 dp[n-1][m-1]
dp[n][m]:n个不同的球放入m个相同的盒子的放法,不空
边界条件:
k个不同球放入k个相同的盒子,不空放法只有一种: dp[k][k] = 1, k>=0
k个不同球放入0个盒子,dp[k][0]=0, k>=1
n个不同球放入m个盒子,球不够,盒子会空,dp[n][m]=0, n<m
状态转移方程:
dp[n][m] = m*dp[n-1][m] + dp[n-1][m-1] , 1<=m<n
4 球不同,盒同,可空
一种解法同情况3的思路一,对于情况1(球同,盒同,可空)的各种组合,分别讨论;
另一种解法:情况7中的一般情况(3个元素都相异),比如116,一共有6种排列(球是不同的),此问中,盒子是相同的,因此这6种排列都只算一种情况。但如果2个元素相同的时候,有且只有 008,只有3种排列,我们多添加3种进去,令其也重复6次,则(6561+3)就是 所有的情况都重复了6次,(6561+3)/6=1094即为所求。
5 球同,盒不同,不空
插板法: C(n-1, m-1)n个球有n+1个空,但是不能为空,两端的空不能选,剩n-1个空;m个盒子,只需要m-1个板即可分成m份
6 球同,盒不同,可空
我们在情况5下继续讨论,我们可以先假设m个盒子里都放好了1个球,所以说白了就是,现在有m+n个相同的球,要放入m个不同的箱子,没有空箱。也就是情况5
7 球不同,盒不同,可空
每个球都有3种选择,8个球就有3^8=65618 球不同,盒不同,不空
思路一:
这三个元素进行全排列A(3,3)=6,乘以966=5796即为所求
思路二:
因为球是不同的,所以dp[n][m]得到的盒子相同的情况,只要再给盒子定义顺序,就等于现在的答案了
dp[n][m] * fact[m] , dp[n][m] 为情况3的第二类斯特林数,fact[m]为m的阶乘
参考资料: