【趣味学算法】00_百鸡百钱

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:

一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

翻译一下就是:其中公鸡 5 块一只,母鸡 3 块一只,3 只小鸡算 1 块,要用 100 块钱买 100 只鸡,数量各是多少?

那么我们要做的就是求出同时满足以下两个式子的解:

公鸡+母鸡+小鸡=100
5*公鸡+3*母鸡+小鸡/3=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 2134101=72114次计算,但当公鸡和母鸡的数量知道后小鸡的数量就是确定的,比如当公鸡和母鸡的数量分别为1和9时,那么小鸡的数量只能90,只需要判断(1,9,90)这组数据是否同时满足条件即可

那么就可以优化一下,用 100 − c o c k − h e n 100-cock-hen 100cockhen ( 100 − 5 ∗ c o c k − 3 ∗ h e n ) ∗ 3 (100-5*cock-3*hen)*3 (1005cock3hen)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 5coke+3hen+100cokehen/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+(1005cock3hen)3=100即可,优化后就只需要计算 21 ∗ 34 21*34 2134=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))
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值