【C++】球盒问题总结(八种情况)


n个球放入m个盒子里一共是八种情况:

1.球相同 盒不同 无空箱

① a n s = C ( n − 1 , m − 1 ) ( n > = m ) ② a n s = 0 ( n < m ) ① ans=C(n-1,m-1) (n>=m)\\ ② ans=0 (n<m) ans=C(n1,m1)(n>=m)ans=0(n<m)
可以用插板法,n 个球中总共有 n-1 个空隙,根据条件,我们只需要在 n−1 个空隙中插 m-1 个板子即可。

2.球相同 盒不同 允许空箱

a n s = C ( n + m − 1 , m − 1 ) ans=C(n+m-1,m-1) ans=C(n+m1,m1)
既然允许有空盒,那么我们可以多加 m 个“虚”的球,预先塞进每个盒子。

这样问题就化归成了有 n+m 个相同的球和 m 个不同的盒子,不允许有空盒的情况,直接运用上面的结论就可以解决问题了。

3.球不同 盒相同 无空箱

即第二类斯特林数
① d p [ n ] [ m ] = m ∗ d p [ n − 1 ] [ m ] + d p [ n − 1 ] [ m − 1 ]   ( 1 < = m < n ) d p [ k ] [ k ] = 1   ( k > = 0 ) d p [ k ] [ 0 ] = 0   ( k > = 1 ) ② a n s = 0   ( n < m ) ①dp[n][m]=m*dp[n-1][m]+dp[n-1][m-1] \ (1<=m<n)\\ dp[k][k]=1 \ (k>=0)\\ dp[k][0]=0 \ (k>=1)\\ ②ans=0 \ (n<m) dp[n][m]=mdp[n1][m]+dp[n1][m1] (1<=m<n)dp[k][k]=1 (k>=0)dp[k][0]=0 (k>=1)ans=0 (n<m)
对于第 n 个球,如果之前的 n-1 个球已经放在了 m 个盒子里,那么第 n 个球就可以随便放在这 m 个盒子中,因为我没有新开一个盒子,那么答案就是m×dp[n-1,m]。
另外,如果我是新开了一个盒子,那么只有一种可能,答案是 dp[n-1][m-1]。

4.球不同 盒相同 允许空箱

a n s = ∑ d p [ n ] [ i ] , 0 < = i < = m , d p [ n ] [ m ] ans= \sum dp[n][i],0<=i<=m,dp[n][m] ans=dp[n][i],0<=i<=m,dp[n][m]
状态转移方程同第三种情况。
其实允许空盒就是可以不用把 m 个盒子全部用完,那么就直接在上一种情况的基础上枚举实际用到的盒子的个数,将答案累加起来就可以了。

5.球不同 盒不同 无空箱

a n s = m ! × d p ( n , m ) ans=m!×dp(n,m) ans=m!×dp(n,m)
较第三种情况就多了盒的有序性,dp(n,m)是相同的情况,m!是考虑顺序。

6.球不同 盒不同 允许空箱

a n s = m n ans=m^n ans=mn
每个球都有m种选择,所以就等于m^n。

7.球相同 盒相同 无空箱

d p [ n ] [ m ] = d p [ n − m ] [ m ] ( n > = m ) d p [ n ] [ m ] = 0 ( n < m ) dp[n][m]=dp[n-m][m] (n>=m)\\ dp[n][m]=0 (n<m) dp[n][m]=dp[nm][m]n>=mdp[n][m]=0n<m
d p [ n ] [ m ] dp[n][m] dp[n][m]表示已放进 n n n 个球,有 m m m 个盒子。

8.球相同 盒相同 允许空箱

d p [ n ] [ m ] = d p [ n ] [ m − 1 ] + d p [ n − m ] [ m ]   ( n > = m ) d p [ n ] [ m ] = d p [ n ] [ m − 1 ]   ( n < m ) 边 界 : d p [ k ] [ 1 ] = 1 dp[n][m]=dp[n][m-1]+dp[n-m][m]\ (n>=m)\\ dp[n][m]=dp[n][m-1] \ (n<m)\\ 边界:dp[k][1]=1 dp[n][m]=dp[n][m1]+dp[nm][m] (n>=m)dp[n][m]=dp[n][m1] (n<m)dp[k][1]=1

d p [ n ] [ m ] dp[n][m] dp[n][m]表示已放进 n n n 个球,有 m m m 个盒子。
考虑小球比盒子多时,可以选择将盘子不放满或者放满分别对应 d p [ n ] [ m − 1 ] 和 d p [ n − m ] [ m ] dp[n][m-1] 和 dp[n-m][m] dp[n][m1]dp[nm][m]
但小球比盒子少时,已经不存在放满的情况了,直接$ dp[n][m-1]$ 。

  • 17
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值