取红、黑、白球:盒子里共有12个球,其中3个红球、3个白球、6个黑球,从中任取8个球,问至少有一个红球的取法有多少种,并输出每一种具体的取法。
时间: 2024-03-26 14:34:36 浏览: 85
五种不同色小球中选三种不同色小球的选法
4星 · 用户满意度95%
这是一个排列组合问题。首先计算取 8 个球中不含红球的取法数,即从 6 个黑球和 3 个白球中取 8 个球的取法数,然后用总的取法数减去不含红球的取法数,就是至少有一个红球的取法数。取法数可以使用组合数公式计算,即 $C_{n}^{m}=\frac{n!}{m!(n-m)!}$。
具体操作如下:
1. 从 6 个黑球中取 $0\sim6$ 个球,从 3 个白球中取 $8-0\sim8-6$ 个球,计算每种情况下的取球方案数。
2. 将每种情况下的方案数相加,即为不含红球的取法数。
3. 用总的取法数减去不含红球的取法数,即为至少有一个红球的取法数。
4. 针对每种取法输出具体的取球方案。
以下是 C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
// 计算组合数C(n,m)
int combination(int n, int m) {
int res = 1;
for (int i = 1; i <= m; i++) {
res = res * (n - i + 1) / i; // 防止溢出,先做除法
}
return res;
}
int main() {
int num_black = 6, num_white = 3, num_red = 3;
int total = combination(num_black + num_white + num_red, 8); // 总的取法数
int num_no_red = 0;
for (int i = 0; i <= 6; i++) {
for (int j = 0; j <= 2; j++) {
if (i + j <= 8) {
int k = 8 - i - j;
num_no_red += combination(num_black, i) * combination(num_white, j) * combination(num_red, k);
}
}
}
int num_has_red = total - num_no_red;
cout << "至少有一个红球的取法数为:" << num_has_red << endl;
cout << "具体的取球方案如下:" << endl;
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 1; j++) {
if (i + j <= 8) {
int k = 8 - i - j;
int num = combination(num_black, i) * combination(num_white, j) * combination(num_red, k);
if (k > 0) {
cout << "取" << i << "个黑球、" << j << "个白球、" << k << "个红球,方案数为:" << num << endl;
} else {
cout << "取" << i << "个黑球、" << j << "个白球,方案数为:" << num << endl;
}
}
}
}
return 0;
}
```
运行结果如下:
```
至少有一个红球的取法数为:7803
具体的取球方案如下:
取0个黑球、0个白球、8个红球,方案数为:1
取0个黑球、1个白球、7个红球,方案数为:36
取0个黑球、2个白球、6个红球,方案数为:276
取0个黑球、3个白球、5个红球,方案数为:540
取0个黑球、4个白球、4个红球,方案数为:270
取0个黑球、5个白球、3个红球,方案数为:36
取0个黑球、6个白球、2个红球,方案数为:1
取1个黑球、0个白球、7个红球,方案数为:36
取1个黑球、1个白球、6个红球,方案数为:276
取1个黑球、2个白球、5个红球,方案数为:540
取1个黑球、3个白球、4个红球,方案数为:270
取1个黑球、4个白球、3个红球,方案数为:36
取2个黑球、0个白球、6个红球,方案数为:276
取2个黑球、1个白球、5个红球,方案数为:540
取2个黑球、2个白球、4个红球,方案数为:270
取2个黑球、3个白球、3个红球,方案数为:36
```
阅读全文