第二章 算法实例(枚举算法)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
范围:X:1-74 Y:1-200 问X为什么到74,Y到200
分析:
设大小盒的个数分别为 x,y
则:8*x+3*y=600
X:1-74
Y:1-200
算法提示
列举:构造一个双重循环,循环变量分别为x(大盒数量) 和y(小盒数量)。 检验:判断:8*x+3*y=600是否成立; 若是,则x,y就是一个 包装方案。
一张单据上有一个5位数的编码,其千位数和百位数已经变得 模糊不请。但是知道这个5位数是57或67的倍数。现在要设计 一个算法,输出所有满足这些条件的5位数,并统计这样的数 的个数。
No.1
分析:
47
可以填上00,01,02,……97,98,
范围:首先,千位数和百位数
每一个可能解n的值为10047+j*100
第二章 算法实例
2.1枚举算法
小越中学信息技术组
一、作业回顾 A、B两数交换问题: (借用第三者)方法一: C=A:A=B:B=C (加减法)方法二: A=A+B:B=A-B:A=A-B (非零乘除法)方法三: A=A+B:B=A-B:A=A-B 4、称盐问题 1、左边放1、1、2、5法码,共9克 2、右边放9克食盐 3、拿掉法码,将食盐平分,即得 5、判断构成三解形 开始 输入三边a,b,c
开始
关于三重循环
X: 1-74 Y: 1-118 Z: 1-293
Y
x ←1 x<=74 y ←1 y<=118
N
N
Y
z ←1 z<=293
N
判断真正的解 z ←z+1 y ←y+1 x ←x+1 结束
Y
开始
c ←0
j ←0 j<100
n ←10047+j*100
N
输出 j
Y
n mod 57=0或 n mod 67=0 c ←c+1 输出 n j ←j+1
N
结束
Y
编写程序
深化思考题:
一张单据上有一个5位数的编码,其千位数和十位数已经变得模糊不请。但是知道这 个5位数是57或67的倍数。现在要设计一个算法,输出所有满足这些条件的5位数,并 统计它们的个数。
打开一本作业
是否继续列举 Y
N
列举
N 检验
Y
是数学作业吗
放在左边
放在右边
C=C+1
试一试:
请用自己的话试着总结什么是枚举法。
这种列举出所有可能的情况并逐一进行检验,根 据检验的结果执行相应操作的方法就是枚举法。
枚举法的基本思想:是根据提出的问题枚举所有可能状态,并用问题给定的条件检 验哪些是符合条件的,哪些是不符合条件的,去掉。能使命题成立,即为其解。 其实质是一一列举所有可能,过滤掉不合要求,保留符合要求。 枚举法的优点:
N
分别得到三位 a=int(X/100) 数的百位 a、 c=X % 10 十位b、个位c b=(X-100*a-c)/10 a3+b3+c3=X Y N
输出X
X=X+1
结束
枚举法的注意点:
1、选定合适的研究对象的范围。 2、找到判断正确解的条件,列举。
3、逐一检验范围内的所有研究对象。
例1:涂抹数字
N
作业:
P25 1、2、3题
分析:
千位数和十位数 上的数字只能是 0-9中的一个。
i 1 1 1 1 0 0 0 0 4 4 4 4
j 0 1 2 3 7 7 7 7
1
1
0
0
4
4
4
5
7
7
1
1
0
0
4
4
6
7
7
7
1
1
0
0
4
4
8
9
7
7
i 1 1 i 从0变化到9;j从0变化 到9。因此,需要构造一 个双重循环。 可能的解 n ←10407+1000*i+10*j 1 1 9 9 9 9 4 4 4 4
分析: 设大中小盒的个数分别 为x,y,z 则:8*x+5*y+2*z=600 X:1-74 Y:1-118 Z:(600-8*x-5*y)/2
算法提示
构造一个双重循环,循环变量分别为x(大盒数量)和y (中盒数量)。 判断:Z=(600-8*x-5*y)/2是否是整数; 若是,则x,y,z就是一 个包装方案。
… 33 …
33
… 67 …
47
x ←x+1
结束
检验可能的解是否真正的解
判断:5*x+3*y+z/3=100 若是,x,y,z就是一个真 正的解
z ←100-x-y
5*x+3*y+z/3=100
N
Y
输出x,y,z
包装问题:
600个变形金刚,包装的规格 为:大盒(8个)、小盒(3 个);每种规格的盒都不能 为空。请设计一个算法,输 出所有可能的包装方案。
表扬:张娴雯 孙莹、黄豪炳
1 a+b<=c
N a+c<=b N b+c<=a N
输出可构成三角形
Y
Y
Y
输出不能构成三角形
1 结束
第6题:
开始 初始变量c1,c2,sum1,sum2为0 输入一个数据到变量n Y n=0? N N>0? Y N
正数sum1=sum1+n c1=c1+1
负数sum2=sum2+n c2=c2+1
No.1
4
7
上虞区小越中学信息技术组
例2 百鸡百钱问题
“鸡翁一值钱5, 鸡母一值钱3, 鸡雏三值钱1” 现有100钱,欲买100只鸡,问:鸡翁、鸡母、鸡雏各买几只? 分析: 设x,y,z分别为买的鸡翁、鸡母、鸡雏的个数 则:x+y+z=100 范围:鸡翁X: 0-20,鸡母Y: 0-33 鸡雏Z: 100-x-y
列举
检验
Y
是数学作业吗
N
放在左边
放在右边
若一个三位数X=100a+10b+c(a、b、c都是个位数),满 足a3+b3+c3=X,则X称为水仙花数,请设计算法,找出所有 的水仙花数。
研究范围
100 <= X <= 999
列举
分别得到三位数的百位a、十位b、个位c
检验
a3+b3+c3=X
开始 X=100 X<=999 Y
输出x,y值 y ←y+1 x ←x+1 结束
思考题:
如果你是体育委员,假设 为了教学的需要,要对 总共60个篮球进行分组。 要求如下: 1、A类组每组有4个球, B类组每组有6个球; 2、A类组和B类组的数量 都不能为0。 请设计一个算法,输出所 有可能的分组方案。
开始 A=1 A<=14 Y B=1 B<=10 Y A*4+B*6=50 N Y 输出A,B B=B+1 A=A+1 结束 N
流程图
开始 x ←1 x<=74
N
假如要求: 1、大盒是偶数的呢? 2、大盒数量要超过小盒的数量 ……
Y
y ←1
y<=200
N
Y
x*8+y*3= 600?
深化思考题
600个变形金刚,包装的规格为:大 盒(8个)、中盒(5个)、小盒(2 个);每种规格的盒都不能为空。 请设计一个算法,输出所有可能的 包装方案。
开始 c ←0 i ←0 i<=9 1
N
Y
j ←0
j<=9
n ←10047+j*100
N
n mod 57=0或 n mod 67=0
Y
N
1 2
Y
c ←c+1 输出 n
j ←j+1 i ←i+1
c
结束
2
包装问题: 600个变形金刚,包装的规格 为:大盒(8个)、中盒(5 个)、小盒(2个);每种规 格的盒都不能为空。请设计 一个算法,输出所有可能的 包装方案。
99;得到10047,10147,……19947。建一个循环变量为j,从0到99的一个循环,
列举:其次,对每一个n判断是否能被57或67整除。若是,输出一组解,解的 个数+1;若不是,舍弃 检验:n mod 57=0 or n mod 67=0 (其他判断方法)
算法描述 1、计数器c←0 2、j←0 3、判断j<100,是转4,否转向 9 4、可能解 n←10047+100*j 5、判断n是否57或67的倍数,是 转向6;否转向8 6、计数器c←c+1; 7、输出真正的解n 8、j←j+1;转向 3 9、输出解的个数 C 10、结束
j 0 1 2 3 7 7 7 7
1
1
9
9
4
4
4
5
7
7
1
1
9
9
Biblioteka Baidu
4
4
6
7
7
7
1
1
9
9
4
4
8
9
7
7
双重循环的构造
1、i ←0 2、判断i<=9;是转向3, 否则转向7 3、j ←0 4、判断j<=9;是转向5, 否则转向6 5、j ←j+1; 转向4 6、i ←i+1;转向2 7、结束
开始 i ←0
i<=9
输出正数sum1/c1和负数 sum2/c2 结束
想一想:
一天早上,数学课代表收好了数学练习本,他的同 桌物理课代表收好了物理练习本,但是由于一些意 外,两种练习本混在了一起。现在要把混在一起的 74本练习本区分开,假如你是数学课代表,你会怎 么做? 请讲出你的解决方案。
C=1 N C<=74 Y
5*x+3*y+z/3=100
可能的解 X: 0-20 Y: 0-33 Z: 100-x-y
列 举:
建立一个双重循环, 可能的解如下:
x 0 0 0 y 0 1 2 z 100 99 98
Y
开始 x ←0 x<=20
N
Y
y ←0 y<=33 判断可能的解 是否是真正的解 y ←y+1
N
… 0 …
20
⑴由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解;
⑵由于枚举算法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的 正确性比较容易证明。 枚举法的缺点: 枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较 低。
练一练:
学校体育馆买进100个篮球,只有“斯伯丁”和“摩 腾”两个牌子,为运输方便将它们混在了一起运来。 请你设计一个算法,帮助器材保管员统计共有多少 个“斯伯丁”篮球。 要求: 请将你解决问题的流程图绘制出来。
N
Y
j ←0
j<=9
N
Y
j ←j+1
i ←i+1
结束
开始 i ←0 j ←0
思考: 右面的流程 图有没有问 题
i<=9
N N
Y
j<=9
Y
j ←j+1 i ←i+1
结束
算法描述
1、c ← 0;i ←0 2、判断i<=9;是转向 3,否则转向 11 3、j ←0 4、判断j<=9;是转向 5,否则转向 10 5、n ←10407+1000*i+10*j 6、判断n是否57或67的倍数,是转向 7;否转向 9 7、计数器 c ←c+1; 8、输出一个真正的解 n 9、j ←j+1;转向 4 10、i ←i+1;转向 2 11、输出解的个数 c 12、结束
开始 C=0,J=1 N
J<=100
Y 拿出一个篮球 是斯伯丁吗 Y C=C+1 J=J+1 输出C 结束
研究范围
列举
N
检验
枚举法的结构特点: •逐一列举和检验,用循环结构实现。
是否继续列举 Y N
•关键步骤:确定范围、列举、检验。 • 检验就是对某个给定的条件进行判 断,根据判断的不同结果执行不同操作,所以 检验可用分支结构实现。
分析:
设大小盒的个数分别为 x,y
则:8*x+3*y=600
X:1-74
Y:1-200
算法提示
列举:构造一个双重循环,循环变量分别为x(大盒数量) 和y(小盒数量)。 检验:判断:8*x+3*y=600是否成立; 若是,则x,y就是一个 包装方案。
一张单据上有一个5位数的编码,其千位数和百位数已经变得 模糊不请。但是知道这个5位数是57或67的倍数。现在要设计 一个算法,输出所有满足这些条件的5位数,并统计这样的数 的个数。
No.1
分析:
47
可以填上00,01,02,……97,98,
范围:首先,千位数和百位数
每一个可能解n的值为10047+j*100
第二章 算法实例
2.1枚举算法
小越中学信息技术组
一、作业回顾 A、B两数交换问题: (借用第三者)方法一: C=A:A=B:B=C (加减法)方法二: A=A+B:B=A-B:A=A-B (非零乘除法)方法三: A=A+B:B=A-B:A=A-B 4、称盐问题 1、左边放1、1、2、5法码,共9克 2、右边放9克食盐 3、拿掉法码,将食盐平分,即得 5、判断构成三解形 开始 输入三边a,b,c
开始
关于三重循环
X: 1-74 Y: 1-118 Z: 1-293
Y
x ←1 x<=74 y ←1 y<=118
N
N
Y
z ←1 z<=293
N
判断真正的解 z ←z+1 y ←y+1 x ←x+1 结束
Y
开始
c ←0
j ←0 j<100
n ←10047+j*100
N
输出 j
Y
n mod 57=0或 n mod 67=0 c ←c+1 输出 n j ←j+1
N
结束
Y
编写程序
深化思考题:
一张单据上有一个5位数的编码,其千位数和十位数已经变得模糊不请。但是知道这 个5位数是57或67的倍数。现在要设计一个算法,输出所有满足这些条件的5位数,并 统计它们的个数。
打开一本作业
是否继续列举 Y
N
列举
N 检验
Y
是数学作业吗
放在左边
放在右边
C=C+1
试一试:
请用自己的话试着总结什么是枚举法。
这种列举出所有可能的情况并逐一进行检验,根 据检验的结果执行相应操作的方法就是枚举法。
枚举法的基本思想:是根据提出的问题枚举所有可能状态,并用问题给定的条件检 验哪些是符合条件的,哪些是不符合条件的,去掉。能使命题成立,即为其解。 其实质是一一列举所有可能,过滤掉不合要求,保留符合要求。 枚举法的优点:
N
分别得到三位 a=int(X/100) 数的百位 a、 c=X % 10 十位b、个位c b=(X-100*a-c)/10 a3+b3+c3=X Y N
输出X
X=X+1
结束
枚举法的注意点:
1、选定合适的研究对象的范围。 2、找到判断正确解的条件,列举。
3、逐一检验范围内的所有研究对象。
例1:涂抹数字
N
作业:
P25 1、2、3题
分析:
千位数和十位数 上的数字只能是 0-9中的一个。
i 1 1 1 1 0 0 0 0 4 4 4 4
j 0 1 2 3 7 7 7 7
1
1
0
0
4
4
4
5
7
7
1
1
0
0
4
4
6
7
7
7
1
1
0
0
4
4
8
9
7
7
i 1 1 i 从0变化到9;j从0变化 到9。因此,需要构造一 个双重循环。 可能的解 n ←10407+1000*i+10*j 1 1 9 9 9 9 4 4 4 4
分析: 设大中小盒的个数分别 为x,y,z 则:8*x+5*y+2*z=600 X:1-74 Y:1-118 Z:(600-8*x-5*y)/2
算法提示
构造一个双重循环,循环变量分别为x(大盒数量)和y (中盒数量)。 判断:Z=(600-8*x-5*y)/2是否是整数; 若是,则x,y,z就是一 个包装方案。
… 33 …
33
… 67 …
47
x ←x+1
结束
检验可能的解是否真正的解
判断:5*x+3*y+z/3=100 若是,x,y,z就是一个真 正的解
z ←100-x-y
5*x+3*y+z/3=100
N
Y
输出x,y,z
包装问题:
600个变形金刚,包装的规格 为:大盒(8个)、小盒(3 个);每种规格的盒都不能 为空。请设计一个算法,输 出所有可能的包装方案。
表扬:张娴雯 孙莹、黄豪炳
1 a+b<=c
N a+c<=b N b+c<=a N
输出可构成三角形
Y
Y
Y
输出不能构成三角形
1 结束
第6题:
开始 初始变量c1,c2,sum1,sum2为0 输入一个数据到变量n Y n=0? N N>0? Y N
正数sum1=sum1+n c1=c1+1
负数sum2=sum2+n c2=c2+1
No.1
4
7
上虞区小越中学信息技术组
例2 百鸡百钱问题
“鸡翁一值钱5, 鸡母一值钱3, 鸡雏三值钱1” 现有100钱,欲买100只鸡,问:鸡翁、鸡母、鸡雏各买几只? 分析: 设x,y,z分别为买的鸡翁、鸡母、鸡雏的个数 则:x+y+z=100 范围:鸡翁X: 0-20,鸡母Y: 0-33 鸡雏Z: 100-x-y
列举
检验
Y
是数学作业吗
N
放在左边
放在右边
若一个三位数X=100a+10b+c(a、b、c都是个位数),满 足a3+b3+c3=X,则X称为水仙花数,请设计算法,找出所有 的水仙花数。
研究范围
100 <= X <= 999
列举
分别得到三位数的百位a、十位b、个位c
检验
a3+b3+c3=X
开始 X=100 X<=999 Y
输出x,y值 y ←y+1 x ←x+1 结束
思考题:
如果你是体育委员,假设 为了教学的需要,要对 总共60个篮球进行分组。 要求如下: 1、A类组每组有4个球, B类组每组有6个球; 2、A类组和B类组的数量 都不能为0。 请设计一个算法,输出所 有可能的分组方案。
开始 A=1 A<=14 Y B=1 B<=10 Y A*4+B*6=50 N Y 输出A,B B=B+1 A=A+1 结束 N
流程图
开始 x ←1 x<=74
N
假如要求: 1、大盒是偶数的呢? 2、大盒数量要超过小盒的数量 ……
Y
y ←1
y<=200
N
Y
x*8+y*3= 600?
深化思考题
600个变形金刚,包装的规格为:大 盒(8个)、中盒(5个)、小盒(2 个);每种规格的盒都不能为空。 请设计一个算法,输出所有可能的 包装方案。
开始 c ←0 i ←0 i<=9 1
N
Y
j ←0
j<=9
n ←10047+j*100
N
n mod 57=0或 n mod 67=0
Y
N
1 2
Y
c ←c+1 输出 n
j ←j+1 i ←i+1
c
结束
2
包装问题: 600个变形金刚,包装的规格 为:大盒(8个)、中盒(5 个)、小盒(2个);每种规 格的盒都不能为空。请设计 一个算法,输出所有可能的 包装方案。
99;得到10047,10147,……19947。建一个循环变量为j,从0到99的一个循环,
列举:其次,对每一个n判断是否能被57或67整除。若是,输出一组解,解的 个数+1;若不是,舍弃 检验:n mod 57=0 or n mod 67=0 (其他判断方法)
算法描述 1、计数器c←0 2、j←0 3、判断j<100,是转4,否转向 9 4、可能解 n←10047+100*j 5、判断n是否57或67的倍数,是 转向6;否转向8 6、计数器c←c+1; 7、输出真正的解n 8、j←j+1;转向 3 9、输出解的个数 C 10、结束
j 0 1 2 3 7 7 7 7
1
1
9
9
4
4
4
5
7
7
1
1
9
9
Biblioteka Baidu
4
4
6
7
7
7
1
1
9
9
4
4
8
9
7
7
双重循环的构造
1、i ←0 2、判断i<=9;是转向3, 否则转向7 3、j ←0 4、判断j<=9;是转向5, 否则转向6 5、j ←j+1; 转向4 6、i ←i+1;转向2 7、结束
开始 i ←0
i<=9
输出正数sum1/c1和负数 sum2/c2 结束
想一想:
一天早上,数学课代表收好了数学练习本,他的同 桌物理课代表收好了物理练习本,但是由于一些意 外,两种练习本混在了一起。现在要把混在一起的 74本练习本区分开,假如你是数学课代表,你会怎 么做? 请讲出你的解决方案。
C=1 N C<=74 Y
5*x+3*y+z/3=100
可能的解 X: 0-20 Y: 0-33 Z: 100-x-y
列 举:
建立一个双重循环, 可能的解如下:
x 0 0 0 y 0 1 2 z 100 99 98
Y
开始 x ←0 x<=20
N
Y
y ←0 y<=33 判断可能的解 是否是真正的解 y ←y+1
N
… 0 …
20
⑴由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解;
⑵由于枚举算法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的 正确性比较容易证明。 枚举法的缺点: 枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较 低。
练一练:
学校体育馆买进100个篮球,只有“斯伯丁”和“摩 腾”两个牌子,为运输方便将它们混在了一起运来。 请你设计一个算法,帮助器材保管员统计共有多少 个“斯伯丁”篮球。 要求: 请将你解决问题的流程图绘制出来。
N
Y
j ←0
j<=9
N
Y
j ←j+1
i ←i+1
结束
开始 i ←0 j ←0
思考: 右面的流程 图有没有问 题
i<=9
N N
Y
j<=9
Y
j ←j+1 i ←i+1
结束
算法描述
1、c ← 0;i ←0 2、判断i<=9;是转向 3,否则转向 11 3、j ←0 4、判断j<=9;是转向 5,否则转向 10 5、n ←10407+1000*i+10*j 6、判断n是否57或67的倍数,是转向 7;否转向 9 7、计数器 c ←c+1; 8、输出一个真正的解 n 9、j ←j+1;转向 4 10、i ←i+1;转向 2 11、输出解的个数 c 12、结束
开始 C=0,J=1 N
J<=100
Y 拿出一个篮球 是斯伯丁吗 Y C=C+1 J=J+1 输出C 结束
研究范围
列举
N
检验
枚举法的结构特点: •逐一列举和检验,用循环结构实现。
是否继续列举 Y N
•关键步骤:确定范围、列举、检验。 • 检验就是对某个给定的条件进行判 断,根据判断的不同结果执行不同操作,所以 检验可用分支结构实现。