盒子与球(8种)

这篇博客介绍了8种不同的球盒问题解决方案,涉及隔板法和斯特林数在解决球不同、盒不同或两者相同的场景下,是否允许空盒的情况。通过动态规划(dp)解释了球和盒的放置策略,并给出了相应的数学公式和递推关系。
摘要由CSDN通过智能技术生成

1.球同,盒不同,不空(隔板法)

一共有 n − 1 n - 1 n1 个空隙 (总共 n + 1 n + 1 n+1 个空隙,不能空要去掉头尾 = n − 1 n - 1 n1 ) ,要插 m − 1 m - 1 m1 个板,从组合角度出发,答案为 C n − 1 m − 1 C _{n-1}^{m-1} Cn1m1 ,即 n − 1 n-1 n1 个缝隙里咱要选上 m − 1 m-1 m1个隔板,每种选法都是一种方案。

#include <bits/stdc++.h>

#define sf scanf
#define pf printf

using namespace std;

int jie (int x) {
   
	int ans = 1;
	for (int i = 2; i <= x; i ++) {
   
		ans *= i;
	}
	return ans;
}

int C (int n, int m) {
   
	int ans = 0;
	ans = (jie (n)) / (jie (m) * jie (n - m));
	return ans;
}

int n, m;

int main () {
   
	sf ("%d %d", &n, &m);
	pf ("%d", C (n - 1, m - 1));
}

2.球同,盒不同,可空 (还是隔板法)

相当于n个小球放入m个盒子且不能空,为了保证不会空,先拿m个球,让每一个盒子都拥有一个球,相当于多了m个虚球,此时球的数量就是(n+m),隔板就有(m-1)个,缝隙就有(n+m-1)个,所以答案就是 C n + m − 1 m − 1 C_{n+m-1}^{m-1} Cn+m1m1

#include <bits/stdc++.h>
#define int long long
#define sf scanf
#define pf printf

using namespace std;

int jie (int x) {
   
	int ans = 1;
	for (int i = 2; i <= x; i ++) {
   
		ans *= i;
	}
	return ans;
}

int C (int n, int m) {
   
	int ans = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值