(共23张PPT)
枚举算法的程序实现
孙子算经
《孙子算经》是中国古代重要的数学著作。约成书于四、五世纪,也就是大约一千五百年前,作者生平和编写年不详。卷下第31回,可谓是后世“鸡兔同笼”题的始祖,后来传到日本,变成“鹤龟算”。
雉兔同笼
今有雉、兔同笼,上有三十五头,下有九十四足。
问:雉、兔各几何?
解析算法·雉兔同笼
用解析算法列数学表达式?
假设鸡为x,兔子为y
雉兔同笼
答曰:雉二十 三,兔一十二。
雉兔同笼
雉兔同笼 抬脚法
雉兔同笼
除了抬脚法,还有什么方法?
枚举算法
méi
枚
一一列举,逐个检验
穷举法
算法思想
1.把问题的所有的可能解一 一地罗列出来
2.每一个可能解进行判断
3.确定这个可能解是否是问题的真正解
枚举算法
枚举算法·雉兔同笼
当鸡为1的时候,兔子为1,满足条件吗?
当鸡为1的时候,兔子为2,满足条件吗?
当鸡为1的时候,兔子为3,满足条件吗?
……
枚举算法·雉兔同笼
当鸡为2的时候,兔子为1,满足条件吗?
当鸡为2的时候,兔子为2,满足条件吗?
当鸡为2的时候,兔子为3,满足条件吗?
……
枚举算法·雉兔同笼
鸡x的取值范围为 ~
兔y的取值范围为 ~
在这个取值范围内的所有x和y
判断:如果 x、y满足35个头 94只脚
那么我们要求的x、y
初值
终值
1
35
1
35
枚举算法·雉兔同笼
h = 35
f = 94
for x in range(1,35):
for y in range(1,35):
if x + y == 35 and 2 * x + 4 * y == 94 :
print(x,y)
int(input(“head:”))
int(input(“feet:”))
h
h
h
f
枚举算法·雉兔同笼
h = 35
f = 94
for x in range(1,35):
for y in range(1,35):
if x + y == 35 and 2 * x + 4 * y == 94 :
print(x,y)
汉高祖刘邦曾问大将韩信:“你看我能带多少兵?”韩信斜了刘邦一眼说:“你顶多能带十万兵吧!”汉高祖心中有三分不悦,心想:你竟敢小看我!“那你呢?”韩信傲气十足地说:“我呀,当然是多多益善啰!”刘邦心中又添了三分不高兴,勉强说:“将军如此大才,我很佩服。现在,我有一个小小的问题向将军请教,凭将军的大才,答起来一定不费吹灰之力的。”韩信满不在乎地说:“可以可以。”刘邦狡黠地一笑……
孙子算经之韩信点兵
刘邦狡黠地一笑,传令叫来几十个士兵隔墙站队。
刘邦发令:“每三人站成一排。”队站好后,
小队长进来报告:“最后一排只有二人。”
刘邦又传令:“每五人站成一排。”
小队长报告:“最后一排只有三人。”
刘邦再传令:“每七人站成一排。”
小队长报告:“最后一排只有二人。”
刘邦转脸问韩信:“敢问将军,这队士兵有多少人?”
孙子算经之韩信点兵
韩信脱口而出:“二十三人。”刘邦大惊,心中的不快已增至十分,心想:“此人本事太大,我得想法找个岔子把他杀掉,免生后患。”一面则佯装笑脸夸了几句,并问:“你是怎样算的?”
韩信说:“臣幼得黄石公传授《孙子算经》,这孙子乃鬼谷子的弟子,算经中载有此题之算法.
孙子算经之韩信点兵
for x in range(10,100):
if x%3==2 and x%5==3 and x%7==2:
print(x)
孙子算经之韩信点兵
x=10
while x<100:
if x%3==2 and x%5==3 and x%7==2:
print(x)
x=x+1
孙子算经之河妇荡杯
今有妇人河上荡杯,津吏问曰:“杯何以多?”“家有客几十。”津吏曰:“客几何?”妇人曰:“二人共饭,三人共羹,四人共肉,凡用杯六十五,不知客几何?”
荡杯:洗碗
二人共饭,三人共羹,四人共肉:二人共用一个饭碗,三人共用一个汤碗,4人共用一个菜碗
孙子算经之河妇荡杯
for x in range(10,100):
if 1/2*x+1/3*x+1/4*x==65:
print(x)
x=10
while x<100:
if 1/2*x+1/3*x+1/4*x==65:
print(x)
x+=1
今有妇人河上荡杯,津吏问曰:“杯何以多?”“家有客几十。”津吏曰:“客几何?”妇人曰:“二人共饭,三人共羹,四人共肉,凡用杯六十五,不知客几何?”
课堂小结
1.不能遗漏任何一个真正解
2.尽可能使可能解的罗列范围最小
3.在编程时一般采用包含选择结构的循环结构
4.枚举算法的效率一般并不高,但是适用于一些没有明显规律的问题。
枚举算法
Thx!