Python算法案例100-11(三色球)
1.问题描述
一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个 是黑的,现从中任取8个,问共有多少种可能的颜色搭配?
2.问题分析
根据问题描述可设任取的8个球中红球为m个,白球为n个,则黑 球为8-m-n个。又已知12个球中有3个红球、3个白球、6个黑球,因 此,m的取值范围为[0,3],n的取值范围为[0,3],黑球的个数小于 等于6,即8-m-n≤6。
3.算法设计
由上述分析可知,红、白、黑三种颜色球的个数的取值范围已 经确定了,现在要求的是所有可能的颜色搭配情况,因此可以使用 循环结构检测m、n范围内的所有可能取值,再代入8-m-n≤6中进行 验证,能够满足条件8-m-n≤6的那些m、n和8-m-n的组合即为问题的 解。
4.确定程序框架
程序流程图如图2.1所示。
5.完整的程序
根据上面的分析,编写程序如下:
# @desc: 三色球问题if __name__=="__main__":# 从12个球中任取8个,红球m个,白球n个,黑球8-m-n个# m的取值范围为[0,3],因此n的取值范围为[0,3],黑球的个数小于等于6,即8-m-n≤6print("\t 红球 \t 白球 \t 黑球") print("........................") num = 0for m in range(0, 4): for n in range(0, 4): if 8-m-n <= 6: num += 1 print("%2d: %d \t\t %d \t\t %d" %(num, m, n, 8-m-n))
6.运行结果
在PyCharm下运行程序,结果如图2.2所示。从输出结果中可 知,取出的8个球中,红、白、黑三色球可能的颜色搭配共有13种。
相关知识总结
7. 本题涉及的核心知识点
🔹(1)循环枚举(暴力搜索思想)
🔹(2)变量建模思想
🔹(3)约束条件判断核心条件:
转化为代码判断:8 - m - n <= 6
👉 本质是“在限制条件下寻找可行解”
🔹(4)计数思想
8. 本题重点
✔ 重点一:如何把实际问题转成程序模型
✔ 重点二:双重循环枚举方法
✔ 重点三:条件筛选思想
9. 本题难点
❗ 难点一:如何想到“用变量表示球”
学生容易卡在:
❗ 难点二:约束条件的正确转换
关键点:
❗ 难点三:理解“枚举而不是计算公式”
10. 一句话总结
本题通过“变量建模 + 双循环枚举 + 条件筛选”,解决了组合计数问题,是学习暴力搜索与基础算法建模的经典入门案例。
拓展思考
如果改为:红球 5 个、白球 4 个、黑球 10 个、任取 9 个球你还能写出程序吗?
编程能力提升点