注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:
一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
翻译一下就是:其中公鸡 5 块一只,母鸡 3 块一只,3 只小鸡算 1 块,要用 100 块钱买 100 只鸡,数量各是多少?
那么我们要做的就是求出同时满足以下两个式子的解:
穷举法思路
全是公鸡100/5=20只,全是母鸡100/3=33只,全是小鸡100只,那么每种鸡的取值范围就出来了,然后把取值范围内的数字一一进行组合代入计算找到满足上述式子的所有组合即可
代码实现:
for coke in range(21):
for hen in range(34):
for chick in range(101):
if chick+coke+hen==100 and 5*coke+3*hen+chick/3==100:
print('公鸡:%d 母鸡:%d 小鸡:%d'%(coke,hen,chick))
输出:
公鸡:0 母鸡:25 小鸡:75
公鸡:4 母鸡:18 小鸡:78
公鸡:8 母鸡:11 小鸡:81
公鸡:12 母鸡:4 小鸡:84
让我们来思考一下,以上思路会进行 21 ∗ 34 ∗ 101 21*34*101 21∗34∗101=72114次计算,但当公鸡和母鸡的数量知道后小鸡的数量就是确定的,比如当公鸡和母鸡的数量分别为1和9时,那么小鸡的数量只能90,只需要判断(1,9,90)这组数据是否同时满足条件即可
那么就可以优化一下,用 100 − c o c k − h e n 100-cock-hen 100−cock−hen或 ( 100 − 5 ∗ c o c k − 3 ∗ h e n ) ∗ 3 (100-5*cock-3*hen)*3 (100−5∗cock−3∗hen)∗3来表示小鸡的数量,那么只需满足条件 5 ∗ c o k e + 3 ∗ h e n + ( 100 − c o k e − h e n ) / 3 5*coke+3*hen+(100-coke-hen)/3 5∗coke+3∗hen+(100−coke−hen)/3 =100 或 c o c k + h e n + ( 100 − 5 ∗ c o c k − 3 ∗ h e n ) ∗ 3 cock+hen+(100-5*cock-3*hen)*3 cock+hen+(100−5∗cock−3∗hen)∗3=100即可,优化后就只需要计算 21 ∗ 34 21*34 21∗34=714次
优化解法:
for cock in range(21):
for hen in range(34):
if (100-5*cock-3*hen)*3+cock+hen==100:
chick = 100-cock-hen
print('公鸡:%d 母鸡:%d 小鸡:%d'%(cock,hen,chick))