打卡 c语言趣味编程 三色球问题

发布时间 2023-05-19 22:47:19作者: 起名字真难_qmz

问题描述:

  一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少种可能的颜色搭配?

思路:

  使用递归方法计算组合数,并通过两个嵌套循环遍历了所有可能的红球、白球和黑球的数量组合。对于每个组合,计算该组合下的可能性,然后将其累加到可能组合变量中。最后输出可能的颜色搭配数量。

流程图:

for嵌套太麻烦了,给出文字的

  1. 开始
  2. 初始化红球数量为3,白球数量为3,黑球数量为6,选取的球的数量为8,可能的颜色搭配数量为0。
  3. 遍历所有可能的红球数量(从0到最小值:选取的球的数量和红球数量之间的较小值)
    1. 对于每个红球数量,遍历所有可能的白球数量(从0到最小值:选取的球的数量减去红球数量和白球数量之间的较小值)
      1. 根据选取的红球数量、白球数量和黑球数量,计算当前组合下的可能性
      2. 将该组合的可能性累加到可能的颜色搭配数量中
    2. 结束白球数量的循环
  4. 结束红球数量的循环
  5. 输出可能的颜色搭配数量
  6. 结束

代码实现:

 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 }