题目:M个相同的小球,放入N个相同的箱子,允许有的箱子空,求共有多少种分配的方法。(箱子不区分先后顺序,如有6个球,1,2,3和3,2,1是同一种放法)。
1、这是一个典型的高中数学组合问题。假设将M个小球排成一行,我们可以在M-1个相邻的空隙中插入N-1个分割线来划分成N个箱子。因为相同的小球和相同的箱子不区分先后顺序,所以只需要考虑分割线的位置。问题转化为在M-1个空隙中选择N-1个位置放置分割线的组合数。
// 计算组合数C(n, k)
int combination(int n, int k) {
if (k == 0 || n == k) {
return 1;
}
// 使用公式 C(n, k) = C(n, n-k) 来减少计算量
if (k > n - k) {
k = n - k;
}
int result = 1;
for (int i = 1; i <= k; i++) {
result = result * (n - i + 1) / i;
}
return result;
}
// 计算放置小球的方法数
int countBallPlacement(int m, int n) {
return combination(m - 1, n - 1);
}