Peter算法小课堂—球盒问题

球盒问题有8类,分别如下图

相同的球放入相同的盒子

根据上一篇Peter算法小课堂---正整数拆分-CSDN博客

简单来说,就这样👇

将相同的球放入相同的盒子,其实相当于将正整数i分为j个正整数的个数

cpp 复制代码
cin>>n>>m;
if(n<m){
	cout<<0<<endl;
	return 0;
}
for(ll i=2;i<=n;i++) f[i][1]=1;
for(ll j=2;j<=m;j++)
	for(ll i=j;i<=n;i++)
		f[i][j]=f[i-1][j-1]+f[i-j][j];
cout<<f[n][n]<<endl;

相同的球放入不同的盒子

其实,我们直接排列组合一下

以每个盒子至少一个球举例。我们将这些球排成一排,用一些板把它们分开。如下图

若每个盒子可为空,则我们可以在每个盒子里提前放一个球,其它同上。

cpp 复制代码
cin>>n>>m;
if(n<m){
	cout<<0<<endl;
	return 0;
}
ll ans=1;
for(ll i=1;i<=m-1;i++){
	ans*=n-i;
	ans/=i;
}
cout<<ans<<endl;

不同的球放入相同的盒子(第二类stirling数)

fij表示将前i个球放入相同的盒子,不允许空的情况,具体状态转移方程请看下图

第一种情况,左边:选完后变成m-1个装n-1个球,fn-1m-1

第二种情况,右边:先让前n-1个球放m盒子,第n个球挑一盒

cpp 复制代码
cin>>n>>m;
if(n<m){
	cout<<0<<endl;
	return 0;
}
for(ll i=1;i<=n;i++) S[i][1]=1;
for(ll j=2;j<=m;j++)
	for(ll i=j;i<=n;i++)
		S[i][j]=S[i-1][j-1]+j*S[i-1][j];
cout<S[n][m]<<endl;

不同的球放入不同的盒子

假设球相同,那么答案就是Snm

然后再排列球,m!

因此,答案就是Snm*m!

希望这些对大家有用,谢谢😀

相关推荐
-森屿安年-12 天前
63. 不同路径 II
c++·算法·动态规划
林森lsjs12 天前
斐波那契数列的 N 种解法:从递归到动态规划的优化之路【算法思考】
算法·动态规划
workflower13 天前
互联网与大数据环境下制造服务模式
人工智能·自然语言处理·数据挖掘·自动驾驶·动态规划·制造
2601_9618451513 天前
花生十三网课网盘|百度网盘|下载
数据结构·算法·链表·贪心算法·排序算法·线性回归·动态规划
拂拉氏13 天前
【知识讲解-题目讲解】算法系列之动态规划入门(下)
算法·leetcode·动态规划
2601_9618451513 天前
花生十三图推思维导图|图形推理|技巧
数据结构·算法·链表·贪心算法·排序算法·线性回归·动态规划
workflower13 天前
使用大语言模型处理用户需求
大数据·人工智能·设计模式·重构·动态规划
青山木14 天前
Hot 100 --- 滑动窗口最大值
java·数据结构·算法·leetcode·动态规划
xhtdj15 天前
智源大会圆桌大模型没有终局具身智能可能是中国的 AlphaGo 时刻
人工智能·clickhouse·安全·动态规划
2301_7644413315 天前
番茄钟+AI:高效专注的秘密武器
人工智能·算法·数学建模·动态规划·交互