本文共 1772 字,大约阅读时间需要 5 分钟。
算法内有很多套路,比如,二分法,二叉树法,循环迭代法,冒泡排序法,暴力破解法等等各种各样的算法,这些算法针对不同的模型,模型就先不解释了,我们今天主要讨论的是暴力破解法也称作穷举法,这种算法相当对得起它的名字,因为暴力所以相对简单,适用人群是喜欢暴力的,简单的人群,但可能不是最高效的。简单来说,优点:此算法简单,暴力,效果直观,缺点:运行效率较低,对内存等消耗比较大。下面开始讲解百鸡百钱。
译文:公鸡一只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,小鸡:7526公鸡:4,,母鸡18,小鸡:784019公鸡:8,,母鸡11,小鸡:818012公鸡:12,,母鸡4,小鸡:8412005也就是说总共循环了12005次。有四个符合条件的选项
修改循环的次数,看看会发生什么?
count=0for 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,小鸡:7526公鸡:4,,母鸡18,小鸡:78419公鸡:8,,母鸡11,小鸡:81812公鸡:12,,母鸡4,小鸡:841205可以发现循环次数减少了,也就是说,效率提高了,循环次数减少意味着内存的消耗以及运行时间的减少
再次修改循环次数,答案彻底揭晓:
count=0for 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,小鸡:7526公鸡:4,,母鸡18,小鸡:78155公鸡:8,,母鸡11,小鸡:81284公鸡:12,,母鸡4,小鸡:84401#为什么循环次数是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这个条件不需要,这个条件无关循环次数。
转载地址:http://hakr.baihongyu.com/