百鸡百钱 - 经典问题


1. 百鸡百钱

百鸡百钱,即公鸡每只5元,母鸡每只3元,小鸡3只1元,一百元买一百只鸡,
问: 分别有多少只公鸡、母鸡和小鸡?

2. 问题分析

假设公鸡为x只,母鸡为y只,小鸡z只,那么以下公式成立:

x + y + z = 100
5x + 3y + z/3 = 100 

按极限思维分析:
如果只买公鸡,最多能买100/5 = 20只,同理,母鸡最多能买33只。
而 z = 100 - 20 - 33 = 47,向3的倍数取整为48只,即小鸡最少为48只。

此时,进一步推理:
既然小鸡最少48只,那么公鸡和母鸡的总价为100-48/3=84元
再按照价格的极限分析,发现:

x <= ( 100 - (48/3) )/5 = 16
y <= ( 100 - (48/3) )/3 = 28

3. 编码

# -*- coding: utf-8 -*-
def hundred_calc():
    #极限值实际无法达到
    x = 16 - 1 # 公鸡
    y = 28 - 1 # 母鸡
    z = 48 + 3 # 小鸡
    for xindex in range(0, x):
        for yindex in range(0, y):
            for zindex in range(z, 100, 3):
                if xindex + yindex + zindex == 100 and 5*xindex + 3*yindex + zindex/3 == 100:
                    print("公鸡 ", xindex, " 母鸡 ", yindex, " 小鸡 ", zindex)

hundred_calc()

4. 总结

经过简单地分析问题,能有效地节省计算机资源。

  1. 按硬核编码,理论计算100 * 100 * 100 = 1000000次
  2. 增加步长(倍数),理论计算 33 * 100 * 100 = 330000次
  3. 一次极限判断,理论计算20 * 33 * 17 = 11220次
  4. 二次判断,理论计算 15 * 27 * 16 = 6840次
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值