鱼C-小师妹 发表于 2021-1-27 15:17:01

00 - 百钱百鸡【师妹小讲堂】

本帖最后由 鱼C-小师妹 于 2021-3-25 10:25 编辑

在几个新手总会踩的“坑”|【辛 酸 血 泪】发出后,师兄们的反应还不错。



让小师妹继续采用“手写+讲解”形式来讲编程技术。

好吧,既然温柔善良可爱如我,那就安排,噔噔噔,就是:

师妹小讲堂

师妹小讲堂

师妹小讲堂

本系列基于 Python,从最简单算法题目,一步一步深入到力扣 5 星难题!

涉及到的共识,流程图,程序结构等等概念。

小师妹都会边讲边在黑板上画出来,一目了然{:10_297:}

而底层的知识,小师妹默认你懂!

不懂,请出门左转看小甲鱼老师的课程:

https://www.bilibili.com/video/BV1c4411e77t

哈哈哈,想想就是一个艰巨的任务,不过,我喜欢!

还不一键三连,废话不多说,开始!


百钱百鸡



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

一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
咱们直接换成软妹币翻译一下:

其中公鸡 5 块一只,母鸡 3 块一只,3 只小鸡算 1 块,要用 100 块钱买 100 只鸡,数量各是多少?
题目要求买 100 只,由此可知,所买公鸡的数量肯定在 0~20 之间。

同理,母鸡的数量在 0~33 之间。

创建变量 cock 代替公鸡,hen 代替母鸡,chicken 代替小鸡。

那么 cock+hen+chicken == 100,将百钱买百鸡问题就转化成解方程组。

一旦可以写成公式,那么就可以用程序来代替。

除了上面的条件,还有价格之和为 100:cock*5 + hen*3 + chicken/3 == 100

对于方程组,最简单粗暴的方式就是用穷举循环的方法来解决!

反正计算机最擅长的“傻算”。

通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。

cock 的取值范围是 0~20,可用循环语句实现:

for cock in range(0,21)

钱的数量是固定的,要买的鸡的数量也是固定的!

既然穷举完公鸡,就在其基础上穷举母鸡,然后再在其中穷举小鸡。

每一次都傻算就好,我们可以利用三层循环的嵌套来解决:


[*]第一层循环控制公鸡的数量
[*]第二层控制母鸡的数量
[*]最内层控制小鸡的数量

每层循环的初值 是0(即买的 100 只鸡中,可能没有公鸡,也可能没有母鸡或小鸡)

循环的控制条件就是公鸡、母鸡和小鸡用百钱最多能够买到的数量!

公鸡最多 20 只,母鸡最多 33 只,小鸡最多 100 只。

穷举循环的特点就是把所有情况都考虑到,因此每层循环执行一次,对应循环变量的值就要加 1 。

很傻很粗暴的循环就好,很方便理解对吧。

化成流程图就是(详细步骤见视频):



根据流程图,构建程序框架如下:

while cock <= 20:
      # 内层循环控制母鸡数量取值范围为0~33
      hen = 0
      while hen <= 33:
            # 内层循环控制小鸡数量取值范围为0~100
            chicken = 0
            while chicken <= 100:
                # 条件控制
                if (5 * cock + 3 * hen + chicken / 3.0 == 100) and (cock + hen + chicken == 100):
                  print("cock=%d,hen=%d,chicken=%d\n" % (cock, hen, chicken))
                chicken += 1
            hen += 1
      cock += 1
在三层循环中,遇到满足 cock+hen+chicken == 100 和 5×cock+3×hen+chicken/3 == 100,则输出。

输出结果:

**** Hidden Message *****

源码:


优化

以上算法需要穷举尝试 21×34×101=72114 次,算法的效率显然可以优化!

对于本题来说,公鸡的数量确定后,小鸡的数量就固定为 100-cock-hen,无须再进行穷举了!

此时约束条件只有一个,即 5×cock+3×hen+chicken/3=100。

思路有啦,具体代码,自己写!
(答案:)

欢迎下方留言正确答案!!

https://www.bilibili.com/video/BV1HT4y1K7DY?p=2

蒋博文 发表于 2021-1-27 16:26:28

小师妹又漂亮了{:5_109:}{:5_101:}

kkop919 发表于 2021-2-6 11:30:20

缺少初始化cock,代码报错。增加cock = 0 后正常运行

千霜碎岳 发表于 2021-2-23 17:14:15

小师妹就是我学习的动力

鱼C-小师妹 发表于 2021-2-23 19:06:56

千霜碎岳 发表于 2021-2-23 17:14
小师妹就是我学习的动力

那小师妹给你加油{:5_105:}

454654asdas 发表于 2021-3-24 19:36:54

for cock in range(0,101,5):
    for hen in range(0,101 - cock,3):
      chicken=100-cock-hen
      if cock/5+hen/3+chicken*3==100:
            print("cock=%d,hen=%d,chicken=%d"%(cock/5,hen/3,chicken*3))

python3.8.2 发表于 2021-4-9 19:52:57

cock, hen, chick = 0, 0, 0    #数量

for cock in range(0,21):
    for hen in range(0,34):
      for chick in range(100 - cock - hen,101,3):

            total = cock + hen + chick
            total_price = cock*5 + hen*3 + chick/3

            if total == total_price == 100:
                print('cock = %d, hen = %d, chick = %d, 总数 = %d, 总价 = %d'
                      % (cock, hen, chick, total, total_price))

yunmemory 发表于 2021-4-12 08:41:21

# Initiate the value
hen = 0
rooster = 0
chick = 0

# start calculating
for rooster in range(21):
    for hen in range(34):
      if (100 - 3 * hen - 5 * rooster) * 3 + hen + rooster == 100:
            chick = 100 - hen - rooster
            print(f"rooster is {rooster},"
                  f"hen is {hen},"
                  f"chick is {chick}")

绯红俚语 发表于 2021-4-12 23:13:11

看完视频过来看看流程,{:10_264:}

,。,。,,。 发表于 2021-4-14 13:56:16

bool想学C 发表于 2021-4-24 11:03:09

谢谢师妹带我飞

Ayanyi 发表于 2021-5-13 09:26:33

初级版
cock=0
while cock <=20:
    hen=0
    while hen<=33:
      chicken=0
      while chicken<=100:
            if (5*cock+3*hen+chicken/3==100) and (cock+hen+chicken==100):
                print('cock=%d,hen=%d,chicken=%d\n' %(cock,hen,chicken))
            chicken+=1
      hen+=1
    cock+=1

lifenggood 发表于 2021-5-21 10:01:01

谢谢分享

知趣 发表于 2021-5-28 19:27:11

加油!!!!!!!!!

西瓜学拍婶 发表于 2021-6-7 22:28:57

谢谢小师妹带我飞

zhangyuesd 发表于 2021-6-21 10:44:28

for x in range(21):
    for y in range(34):
            if 5 * x + 3 * y + (100-x-y) / 3 == 100:
                print(f'公鸡 = {x}, 母鸡 = {y}, 小鸡 = {100-x-y}')

mzxmzx 发表于 2021-7-6 19:50:01

for i in range(20):
    for j in range(33):
      if 5*i+3*j+(100-i-j)/3==100:
            print("公鸡%d只,母鸡%d只,小鸡%d只"%(i,j,100-i-j))

fumun 发表于 2021-7-9 13:45:10

本帖最后由 fumun 于 2021-7-9 13:54 编辑

写了个简单的,不知道如何
for coke in range(0,21):
    for hen in range(0,34):
      for chicken in range(0,101-coke-hen):
            if 5*coke + 3*hen + chicken/3 == 100:
                if coke+hen+chicken == 100:
                  print('coke:', coke, 'hen:', hen, 'chicken:', chicken)

xjy=lwy 发表于 2021-8-3 10:03:53

我写的for循环行吗for j1 in range(0,21):
    for j2 in range(0,34):
      for j3 in range(0,101):
            if j1+j2+j3 == 100 and j1*5+j2*3+j3//3 == 100:
                print("%d公鸡%d母鸡%d小鸡" %(j1,j2,j3))

鄙人gdll 发表于 2021-8-4 16:53:11


#公雞0~20
cock = 0
while cock <= 20:
    #內層循環從0~33(母雞)
    hen = 0

    while hen <= 33:
      #內層循環每次從0~100(小雞)
      chicken = 0

      while chicken <= 100:
            if (5 * cock+3 * hen+chicken / 3.0 == 100) and (cock + hen + chicken == 100):

                print("cock=%d,hen=%d,chicken=%d\n" % (cock, hen, chicken))
               
            
            chicken = chicken+1

      hen = hen+1

    cock = cock+1

页: [1] 2 3 4 5
查看完整版本: 00 - 百钱百鸡【师妹小讲堂】