Python中的百鸡百钱经典暴力算法
算法内有很多套路,比如,二分法,二叉树法,循环迭代法,冒泡排序法,暴力破解法等等各种各样的算法,这些算法针对不同的模型,模型就先不解释了,我们今天主要讨论的是暴力破解法也称作穷举法,这种算法相当对得起它的名字,因为暴力所以相对简单,适用人群是喜欢暴力的,简单的人群,但可能不是最高效的。简单来说,优点:此算法简单,暴力,效果直观,缺点:运行效率较低,对内存等消耗比较大。下面开始讲解百鸡百钱。
百钱百鸡:我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
译文:公鸡一只5元,母鸡一只3元,小鸡3只1元。如何用100元买100只鸡。其中公鸡,母鸡,小鸡的数量各是多少?
根据题意,可以得出,两个100,公鸡数目加母鸡数目加小鸡数目等于100,总的价钱等于100.也就是说,假设公鸡数目等于x,
母鸡数目等于y,小鸡数目等于z,那么,
5x+3y+z/3=100
x+y+z=100
现在x,y,z的值分别是多少?
使用python解答如下:
count=0
#循环次数的计数,从零开始
for x in range(1000):
#range(?)这个数值为任意都可以,后面讲解这个数值,也就是for循环范围的作用
for y in range(1000):
#同上。
count+=1
#每一次循环后加1,以记录循环次数
z=100-x-y
if 5*x+3*y+z/3==100 and z%3==0:
#如果每个种类价格相加等于100为真
print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))
#打印结果,结果为字符串
print(count)
#打印循环总次数
#程序运行结果为:
公鸡:0,,母鸡25,小鸡:75
26
公鸡:4,,母鸡18,小鸡:78
4019
公鸡:8,,母鸡11,小鸡:81
8012
公鸡:12,,母鸡4,小鸡:84
12005
也就是说总共循环了12005次。有四个符合条件的选项
修改循环的次数,看看会发生什么?
count=0
for x in range(100):
for y in range(100):
count+=1
z=100-x-y
if 5*x+3*y+z/3==100 and z%3==0:
print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))
print(count)
#运行结果:
公鸡:0,,母鸡25,小鸡:75
26
公鸡:4,,母鸡18,小鸡:78
419
公鸡:8,,母鸡11,小鸡:81
812
公鸡:12,,母鸡4,小鸡:84
1205
可以发现循环次数减少了,也就是说,效率提高了,循环次数减少意味着内存的消耗以及运行时间的减少
再次修改循环次数,答案彻底揭晓:
count=0
for x in range(20):
for y in range(33):
count+=1
z=100-x-y
if 5*x+3*y+z/3==100 and z%3==0:
print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))
print(count)
#运行结果:
公鸡:0,,母鸡25,小鸡:75
26
公鸡:4,,母鸡18,小鸡:78
155
公鸡:8,,母鸡11,小鸡:81
284
公鸡:12,,母鸡4,小鸡:84
401
#为什么循环次数是20和33呢?因为,假设全部买公鸡,公鸡单价是5,100元只能最多买20只公鸡,也就是假设#5x=100,那么x=20
#同理,母鸡最多是33,因为3y=100,那么y=33.3333....
#那么,z%3,也就是小鸡的数目必定除以3等于0,这个条件其实可以不需要,因为总共是三个数字,
#x和y的值已经确定了,那么z的值必定可以确定。因为只有三类,所以for循环只需要二层循环,
#z由 z=100-x-y来确定。最后说一句,z%3==0这个条件不需要,这个条件无关循环次数。