问题描述:
一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少种可能的颜色搭配?
思路:
使用递归方法计算组合数,并通过两个嵌套循环遍历了所有可能的红球、白球和黑球的数量组合。对于每个组合,计算该组合下的可能性,然后将其累加到可能组合变量中。最后输出可能的颜色搭配数量。
流程图:
for嵌套太麻烦了,给出文字的
- 开始
- 初始化红球数量为3,白球数量为3,黑球数量为6,选取的球的数量为8,可能的颜色搭配数量为0。
- 遍历所有可能的红球数量(从0到最小值:选取的球的数量和红球数量之间的较小值)
- 对于每个红球数量,遍历所有可能的白球数量(从0到最小值:选取的球的数量减去红球数量和白球数量之间的较小值)
- 根据选取的红球数量、白球数量和黑球数量,计算当前组合下的可能性
- 将该组合的可能性累加到可能的颜色搭配数量中
- 结束白球数量的循环
- 对于每个红球数量,遍历所有可能的白球数量(从0到最小值:选取的球的数量减去红球数量和白球数量之间的较小值)
- 结束红球数量的循环
- 输出可能的颜色搭配数量
- 结束
代码实现:
1 #include <iostream> 2 using namespace std; 3 4 int tcount(int n, int k) { 5 if (k == 0 || k == n) 6 return 1; 7 else 8 return tcount(n - 1, k - 1) + tcount(n - 1, k); 9 } 10 11 int main() { 12 int rCount = 3; // 红球数量 13 int wCount = 3; // 白球数量 14 int bCount = 6; // 黑球数量 15 int total = rCount + wCount + bCount; // 球的总数 16 int selected = 8; // 选取的球的数量 17 18 int ccount = 0; // 可能的颜色搭配数量 19 20 // 遍历所有可能的红球、白球、黑球的数量组合 21 for (int rSelected = 0; rSelected <= min(rCount, selected); rSelected++) { 22 for (int wSelected = 0; wSelected <= min(wCount, selected - rSelected); wSelected++) { 23 int bSelected = selected - rSelected - wSelected; 24 25 // 计算当前组合下的可能性 26 int combination = tcount(rCount, rSelected) * 27 tcount(wCount, wSelected) * 28 tcount(bCount, bSelected); 29 ccount += combination; 30 } 31 } 32 33 cout << "可能的颜色搭配数量:" << ccount << endl; 34 35 return 0; 36 }