对于百钱百鸡问题在看了别人的解法后的一些理解感悟

引用自http://t.csdn.cn/IpqJU

自己的感悟

自己遇到的一个有趣的python题目——百钱百鸡

今天看到了一个很有趣的python题目,对于编程有着较大启发。

话不多说,回归正题

问题是公鸡一只卖5块,母鸡一只卖3块,小鸡3只1块钱,现在有100块钱买100只鸡,问各自多少只?(这是对于三种鸡数目都不能为零的解释)

首先是普通解法:

for rooster in range(1,99):

      for hen in range(1,99):

          for chick in range(1,99):

              if rooster + hen + chick == 100 and rooster*5 + hen*3 + chick/3 == 100:

                print(f'公鸡{rooster}只,母鸡{hen}只,鸡雏{chick}只')

这个对于我的冲击力说实话有点大,简单来说就是拿数一个个试,但是我一开始真没这么想,我是先列出式子,然后自己在纸上算了算,没算出来。对于拿数一个个试,对于人来说肯定是不可能的,但是这计算量对于计算机来说却是很简单,但是我个人不推荐这种算法。因为太过于没脑子,这种做法,运算量小还行,要是运算量大,电脑直接宕机了,根本不现实。当然一些确实需要大量运算的很复杂的问题除外(要不科学家为什么造出超级计算机),但是那也是经过人类的思维,算式简化过的。

进阶解法:

for rooster in range(19):

    for hen in range(32):

        if rooster*5 + hen*3+ (100-rooster-hen)/3 == 100:

            print(f'公鸡{rooster}只,母鸡{hen}只,鸡雏{100-rooster-hen}只。 ')

这个解法的优点:

一:首先是运算量大大降低,有了思维含量(前面说过)

二:其次是少了一个变量,母鸡公鸡小鸡加起来一共100只,那么算出来公鸡和母鸡,剩下的就是小鸡了,只需要在总数里减去两者的和即可。这样可以将三元一次方程组变化成了二元一次方程组,说实话这个解法对于我的启发很大,就是因为它的灵活性,因为将三元化作两元看似很简单,但是对于我这样的小白来说意义非凡。因为其实很多问题,它其实不难,就是思路开阔不开阔的问题,简单来说就是怎么想到这么做的。就像有的初中奥数题我都高中毕业了都不会做,其实就是一个思路的问题。

这算法将变量减少了,从而将计算量大大降低,我想简洁有效才是编程所追求的(小白瞎想的)

然后具体解释一下以上两种解法的数字是怎么得到的

首先是普通解法

我们可以得知公母小鸡一共100只,那么也就是说其中任何一类鸡的数目都≥1,所以也就是说任一种类的鸡的数目都要≤98,由于for in range()的范围问题,很容易得知里面的数字。但是这样要运算98的三次方次,运算量比较大

然后是进阶解法

前面我们让公鸡和母鸡在1到98里面取值,实际上我们分析后可以发现,一共100元,是不足以满足买这么多只公鸡和母鸡的,所以刚才我们忽略了隐藏条件(即总钱数的约束),对范围限制的太过于粗略,现在我们重新限制。

公鸡五元一只,最多买18只(只考虑三种鸡的数目都不能为零和花费不能超过总钱数,不考虑能不能加起来等于100,只要满足小于等于100即可 。因为是否等于100是我们要解决的问题而非限制条件),所以为19

同理,母鸡应为31,所以为32,而小鸡🐥数等于总数减去二者之和。

得证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值