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 小师妹又漂亮了{:5_109:}{:5_101:} 缺少初始化cock,代码报错。增加cock = 0 后正常运行 小师妹就是我学习的动力 千霜碎岳 发表于 2021-2-23 17:14
小师妹就是我学习的动力
那小师妹给你加油{:5_105:} 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)) 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))
# 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}") 看完视频过来看看流程,{:10_264:} 嗯 谢谢师妹带我飞 初级版
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
谢谢分享 加油!!!!!!!!! 谢谢小师妹带我飞 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}')
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: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) 我写的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))
#公雞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