C++ 实现宿舍分配方案计数 - 组合数学应用
C++ 实现宿舍分配方案计数 - 组合数学应用
问题描述
考虑以下应用场景:山东建筑大学烟台校区启用,现需要为 n 位同学分配宿舍。假设学校充分尊重同学们的意见,即可以任何 x 个同学使用一间宿舍 (x > 0),问:一共有多少种宿舍分配方案?
示例
例如:n=3 时,共有 3 位同学需要分配宿舍,假设为张三、李四、王五 3 位同学,则可以有以下 5 种分配方案:
- 每位同学一个宿舍
- 张三同学单独一间,其余两人共用一间
- 李四同学单独一间,其余两人共用一间
- 王五同学单独一间,其余两人共用一间
- 三位同学共用一间
假设学校宿舍的房间数不小于学生数量。
输入
学生数量 n,n <= 100。
输出
所有分配方案的数量。
样例输入
3
样例输出
5
C++ 代码实现
#include<iostream>
using namespace std;
// 计算组合数C(n, m)
int combination(int n, int m) {
if (n < m) {
return 0;
}
if (m == 0 || n == m) {
return 1;
}
int result = 1;
for (int i = n; i > n - m; i--) {
result *= i;
}
for (int i = 1; i <= m; i++) {
result /= i;
}
return result;
}
int main() {
int n;
cin >> n;
int result = 0;
for (int i = 1; i <= n; i++) {
result += combination(n, i);
}
cout << result << endl;
return 0;
}
解释
该代码的核心思路是利用组合数学中的组合数公式。对于 n 个学生,每个学生都有两种选择:单独一间或与其他同学共用。因此,总的分配方案数量等于将 n 个学生分成若干组的方案数。
根据组合数学知识,将 n 个学生分成 i 个组的方案数为 C(n, i),即从 n 个学生中选择 i 个学生组成一个组的方案数。因此,总的分配方案数量为所有 i 的 C(n, i) 的和,即:
∑(i=1 to n) C(n, i)
代码中,combination(n, m) 函数用于计算组合数 C(n, m),main 函数遍历所有可能的组数 i,并计算其对应的组合数 C(n, i),最终将所有组合数相加得到总的分配方案数量。
总结
本文通过 C++ 代码实现,结合组合数学知识,解决了宿舍分配方案计数问题。该代码简洁易懂,能够有效地解决此类问题。希望本文对您有所帮助。
原文地址: https://www.cveoy.top/t/topic/TFg 著作权归作者所有。请勿转载和采集!