枚举法就是将一件事发生的所有可能罗列出来,又称为“穷举法”,根据它的名字不难看出它要求结果是有限个且规模不是特别大,一般都是现实生活中问题的直译
本文由易到难举出大量例子,来熟练这种算法(我自己的一个练习过程)
例如
1.想要知道一个食品袋中鸡蛋的个数,就可以一个一个拿出来(循环),分别判断它是不是鸡蛋,是,就增加一个计数,不是就不计,然后判断食品袋中是否为空,为空则推出循环,不空则继续。
【这里可以将测试数据放到一个数组中,然后初始化计数器,从数组第一个元素进行对比,如果该元素中的数值等于目标数值则计数,python中的len()函数可以计算数组中元素的个数,将循环范围限制在数组元素个数中,就可以避免报错】
当然,python中count()函数可以直接进行统计
#将用户输入的字符串转化为整数列表
array=list(map(int,input().split()))
#假设1代表鸡蛋,统计1的个数
res=arry.count(1)
print(res)
2.加入数学逻辑。已知食品袋中的鸡蛋三个三个数剩两个,五个五个数剩三个,七个七个数剩两个,求食品袋中有多少个鸡蛋(鸡蛋范围100~999)。也就是求100~999范围内同时满足上面三个条件的数,除3余2,除5余3,除7余2
result=[]
for i in range(100,1000):
if i%3==2 and i%5==3 and i%7==2:
result.append(i)
print(result)
3.猜密码。某个密码是六位数,前两位为31,最后两位数字相同,能被16和46整除,找出所有可能的密码并统计其个数。
六位数已知前两位,也就是求后四位的数字,范围0000~9999,最后两位数字相同00,11,22,33,44,55,66,77,88,99,且能被16和14整除 。要紧抓范围和条件
count=0
for i in range(0,10000):
res=310000+i
if i%16==0 and i%46==0:
a=res%10
b=(res%100)//10
if a==b:
print(res)
count=count+1
4.摘苹果。输入苹果的个数和它们分别的高度,人手能伸到的高度,板凳的高度,判断能摘到的苹果个数。设立一个数组存放苹果的高度,人能碰到的最大高度为手+板凳的高度,将苹果高度和 这个最大高度一一比较。
#输入苹果的个数
n=int(input())
#分别输入每个苹果的高度
a=list(int,input().split())
#输入人手臂可以触碰到的最高高度,板凳高度
m,n=int(input().split())
l=m+n
b=[]
count=0
for i in range(n):
if a[i]<=l:
b.append(a[i])
count=count+1
print(b)
print(count)
5.求正整数。对于输入的任意正整数n,求具有n个不同因子的最小正整数m(1≤n≤5000)
【也就是求1到5000范围内的数m,m有n个不同因子】
import math
n=int(input())
#定义函数计算因子数
def count(m):
for i in range(1,int(math.sqrt(m))+1):
if m%i==0:
sn=sn+2
if m==i*i:
sn=sn-1
return sn
#在范围1~50000中查询
for j in range(1,50001):
if count(j)==n:
print(j)
exit()
6.如何用100块钱恰好买100只鸡:大鸡三块一只,小鸡一块三只,不大不小的鸡两块一只
【大鸡100能买33只,中鸡100能买50只,小鸡100能买300只,所以我们的思路是分别遍历取到的大鸡小鸡的个数,然后计算它是否满足条件】
#设三种鸡的个数分别为x、y、z
n=100
for x in range(0,34):
for y in range(0,51):
z=3*(100-3*x-2*y)
if x+y+z==100:
print(x,y,z)
7.(思考)数字三角形。输入边长p,求满足下述条件的三角形方案和个数,a~i分别代表1~9
a
b c
d e
f g h i
条件:
(1)a<f<i
(2)b<d;g<h;c<e
(3)a+b+d+f=f+g+h+i=i+e+c+a=p
------未完待续