博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排列组合 "n个球放入m个盒子m"问题 总结(转)
阅读量:1906 次
发布时间:2019-04-26

本文共 1177 字,大约阅读时间需要 3 分钟。

原文链接:http://blog.csdn.net/qwb492859377/article/details/50654627

求,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共是8种情况,我们现在来一一讨论。

 

1.球同,盒不同,无空箱

C(n-1,m-1), n>=m

0, n<m

使用插板法:n个球中间有n-1个间隙,现在要分成m个盒子,而且不能有空箱子,所以只要在n-1个间隙选出m-1个间隙即可

 

 

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

C(n+m-1,m-1)

我们在第1类情况下继续讨论,我们可以先假设m个盒子里都放好了1个球,所以说白了就是,现在有m+n个相同的球,要放入m个不同的箱子,没有空箱。也就是第1种情况

 

 

3.球不同,盒相同,无空箱

第二类斯特林数dp[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
0,n<m

这种情况就是第二类斯特林数,我们来理解一下这个转移方程。

对于第n个球,如果前面的n-1个球已经放在了m个箱子里,那么现在第n个球放在哪个箱子都是可以的,所以m*dp[n-1][m];

如果前n-1个球已经放在了m-1个箱子里,那么现在第n个球必须要新开一个箱子来存放,所以dp[n-1][m-1]

其他的都没法转移过来

 

 

 

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

sigma dp[n][i],0<=i<=m,dp[n][m]为情况3的第二类斯特林数

这种情况就是在第3种情况的前提下,去枚举使用的箱子的个数

 

 

 

5.球不同,盒不同,无空箱

dp[n][m]*fact[m],dp[n][m]为情况3的第二类斯特林数,fact[m]为m的阶乘

因为球是不同的,所以dp[n][m]得到的盒子相同的情况,只要再给盒子定义顺序,就等于现在的答案了

 

 

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

power(m,n) 表示m的n次方

每个球都有m种选择,所以就等于m^n

 

 

7.球同,盒同,允许空箱

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[1][k]=1,dp[0][k]=1

现在有n个球,和m个箱子,我可以选择在所有箱子里面都放上1个球,也可以不选择这个操作。

如果选择了这个操作,那么就从dp[n-m][m]转移过来

如果没有选择这个操作,那么就从dp[n][m-1]转移过来

 

 

 

8.球同,盒同,无空箱

dp[n-m][m],dp同第7种情况,n>=m

0, n<m

因为要求无空箱,我们先在每个箱子里面放1个球,然后还剩下n-m个球了,再根据情况7答案就出来了

 

如果有错误,希望菊苣指出~

转载请注明出处...

你可能感兴趣的文章
MATLAB指定路径保存图片方法
查看>>
Python一键获取微信推送封面图
查看>>
油猴脚本:微信推送浏览功能拓展
查看>>
JavaScript DOM对象操作详解
查看>>
JavaScript 表单操作与MD5加密
查看>>
CppWeekly 06 structured binding
查看>>
CppWeekly 07 aggreate initialization, variable attributes
查看>>
CppWeekly 08 constexpr
查看>>
Unreal Engine 4.25 Visual Studio Code intellisense error
查看>>
使gazebo_ros能够找到其他package的资源文件
查看>>
右键打开 visual studio developer command prompt
查看>>
利用AirSim在Unreal Engine上获取全景图像
查看>>
神奇的c++等号重载
查看>>
利用uWSGI和Nginx部署Django
查看>>
Linux下修改^M换行符
查看>>
笔记-有关于Vim
查看>>
vnc, vncserver, ssh的locale问题
查看>>
[野路数] Django中使用logging
查看>>
[未修订]ROS学习笔记
查看>>
Eigen学习笔记
查看>>