《数学]枚举法》

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
❖ 有了以上的基础,我们便可以通过图示描述解题 过程,见求解过程示例图

整理pptຫໍສະໝຸດ ❖我们把将段设为顶点,所在段的最大 分值设为顶点的权,各顶点按自西向 东的顺序相连,组成一条游览路线。 显然,如果确定西端为起点、东段为 终点,则这条游览路线的总分值最大。
整理ppt
例题分析
❖本题非常简单,即枚举变量A,B,C的所 有可能取值情况,对每种取值情况判 断是否符合表达式即可。
❖算法如下
for(int A=1;A<=3;A++) for(int B=1;B<=3;B++) for(int B=1;B<=3;B++) if(A+B==C) 输出A,B,C;
整理ppt
for(int A=1;A<=3;A++) for(int B=1;B<=3;B++) { C=A+B; if(C>=1)&&(C<=3) 输出A,B,C; }
通过变量的依赖关系减少了解变量的个数(局部 枚举),优化了枚举算法,n^3 -> n^2。
整理ppt
枚举法解题的一般思路
❖对命题建立正确的数学模型; ❖根据命题确定的数学模型中各变量的
整理ppt
❖在我们的例子中,相应的OUTPUT.TXT的内 容为:
5849
❖输入输出示例:
INPUT.TXT
OUTPUT.TXT
330
5489
222
212
具体的移动方案如图所示。
整理ppt
❖ 我们分析一下表示时钟时针初始位置的数码j(0≦j≦3)与时刻的对 应关系:
▪ 0——12点 ▪ 1——3点 ▪ 2——6点 ▪ 3——9点
整理ppt
❖设 pi表示第i种旋转方法的使用次数 (0≦pi≦3,1≦i≦9)。 则可能的解的集合为{(P1,P2,……, P9)},该集合共含49个状态。从题目 的示意图中,我们可以分析出9个时钟 分别被哪些方法所控制,见下表:
整理ppt
建立时钟控制表
整理ppt
设计算法
因此我们可以设计如下枚举算法(伪代码):
❖用枚举法求解的问题须满足两个条件
▪ 能确定解变量(枚举变量)的个数 n ; ▪ 每个解变量Ai(1 <= i <= n)的可能值
能确定范围且能连续取得。
整理ppt
枚举法算法框架
设解变量的个数是n,Ai1—解变量Ai的最小值;Aik—解变量 Ai的最大值(1≤i≤n),即A11≤A1≤A1k,Ai1≤Ai≤Aik, ……,An1≤An≤Ank
九种时钟状态
整理ppt
❖ 输入数据: 读9个数码,这些数码给出了9个时钟时针的初始位置。数 码与时刻的对应关系为: 0——12点 1——3点 2——6点 3——9点 图中的例子对应下列输入数据: 330 222 212
❖ 输出数据: 输出一个最短的移动序列(数字序列),该序列要使所 有的时钟指针指向12点,若有等价的多个解,仅需给出其 中一个.
变化范围(即可能解集); ❖利用循环语句、条件判断语句逐步求
解或证明;
每一步都可以考虑优化
整理ppt
2 例1 巧妙填数
❖将1~9这九个数字填入九个空格中。 每一横行的三个数字组成一个三位数。 如果要使第二行的三位数是第一行的 两倍, 第三行的三位数是第一行的三 倍, 应怎样填数。(一共4组解,一组 如下图)
算法框架如下(伪代码): for A1←A11 to A1k do
for A2←A21 to A2k do …………………… for Ai←Ai1 to Aik do …………………… for An←An1 to Ank do if 状态(A1,…,Ai,…,An)满足检验条件 then 输出问题的解;
整理ppt
例5 最佳游览线路 (NOI94)
❖ 某旅游区的街道成网格状。其中东西向的街道都 是旅游街,南北向的街道都是林荫道。由于游客 众多,旅游街被规定为单行道,游客在旅游街上 只能从西向东走,在林阴道上则既可从南向北走, 也可以从北向南走。
❖ 阿龙想到这个旅游区游玩。他的好友阿福给了他 一些建议,用分值表示所有旅游街相邻两个路口 之间的街道值得游览的程度,分值时从-100到100 的整数,所有林阴道不打分。所有分值不可能全 是负分。下图是被打过分的某旅游区的街道图。
枚举法的定义
❖所谓枚举法,指的是从可能的解的集 合中一一枚举各元素,用题目给定的 检验条件判定哪些是无用的,哪些是 有用的。能使命题成立的,即为解。
整理ppt
❖ 示例中的解变量有3个:A,B,C。其中 解变量A的可能取值范围A∈{1, … ,3} 解变量B的可能取值范围B∈{1, … ,3} 解变量C的可能取值范围C∈{1, … ,3} 从而问题的可能解有3*3*3=27个,可能解集:
整理ppt
枚举算法的特点及优化
❖枚举法的特点是算法简单,但有时运 算量大。
❖优化枚举算法(考察重点)
枚举算法的时间复杂度=状态总数*考察单 个状态的耗时 ▪ 排除明显不属于解集的元素 ▪ 减少状态总数(即减少枚举变量和枚举 变量的值域) ▪ 降低单个状态的考察代价
整理ppt
❖示例算法显然可以修改如下:
❖ 阿龙可以从任一个路口开始游览,在任一个路口 结束游览。请写一个程序,帮助阿龙找一条最佳 的游览线路,使得这条线路的所有分值总和最大。
整理ppt
图11某旅游区街道示例图
整理ppt
❖ 输入数据: 输入文件是INPUT.TXT。文件的第一行是两个整数M和N,之间用一个空 格符隔开,M表示有多少条旅游街(1≦M≦100),N表示有多少条林 阴道(1≦M≦20001)。接下来的M行依次给出了由北向南每条旅游街 的分值信息。每行有N-1个整数,依次表示了自西向东旅游街每一小 段的分值。同一行相邻两个数之间用一个空格隔开。
for p1 <- 0 to 3 do for p2 <- 0 to 3 do ... ... ... for p9 <- 0 to 3 do
if c1满足时钟1 and c2满足时钟2 and ... and c9满足时钟9
then 打印解路径;
显然,上述枚举算法枚举了所有49=262144个状态, 运算量和运行时间颇大。
OUTPUT.TXT
36
84
-50 –47 36 –30 –23
17 –19 –34 –13 –8
-42 –3 –43 34 –45
整理ppt
❖ 分析:设Lij为第I条旅游街上自西向东第J段的 分值(1 ≦ I ≦ M,1 ≦ J ≦ N – 1)。例 如样例中L12=17,L23=-34,L34=34。
*** × ** ----------
**** **** ---------*****
整理ppt
❖分析:实际上,只要知道乘数和被乘 数就可以写出乘法算式,所以我们可 以枚举乘数与被乘数的每一位。然后 再判断是不是满足条件即可。计算量 是45=1024,对于计算机来说,计算量 非常小。
整理ppt
例4 时钟问题(IOI94-4)
❖ 输出数据: 输出文件是OUTPUT.TXT。文件只有一行,是一个整数,表示你的程序 找到的最佳游览线路的总分值。
❖ 输入输出示例:
INPUT.TXT
OUTPUT.TXT
36
84
-50 –47 36 –30 –23
17 –19 –34 –13 –8
-42 –3 –43 34 –45
整理ppt
❖INPUT.TXT
整理ppt
例2 谁是第几名
❖在某次数学竞赛中, A、B、C、D、E五名学生被取 为前五名。请据下列说法判断出他们的具体名次, 即谁是第几名?
❖条件1: 你如果认为A, B, C, D, E 就是这些人的 第一至第五名的名次排列, 便大错。因为: 没猜对任何一个优胜者的名次。 也没猜对任何一对名次相邻的学生。
❖根据已知条件, A<>1,B<>2,C<>3,D<>4,E<>5,因此排除了一 种可能性,只有4!=24种情况了。(优化: 减少了解变量的取值范围)
整理ppt
例3 古纸残篇
在一位数学家的藏书中夹有一张古旧的纸片。纸片上的字 早已模糊不清了, 只留下曾经写过字的痕迹, 依稀还可以 看出它是一个乘法算式, 如图7所示。这个算式上原来的 数字是什么呢?夹着这张纸片的书页上,“素数”两个字 被醒目的划了出来。难道说, 这个算式与素数有什么关系 吗?有人对此作了深入的研究, 果然发现这个算式中的每 一个数字都是素数, 而且这样的算式是唯一的。请你也研 究一番, 并把这个算式写出来。
(A,B,C)∈{(1,1,1),(1,1,2),(1, 1,3),…,(3,3,1),(3,3,2),(3, 3,3)}
❖ 在上述可能解集中,满足题目给定的检验条件 (A+B==C)的解元素,即为问题的解。
整理ppt
枚举法的适用条件
❖对于可能确定解的值域又一时找不到 其他更好的算法时可以考虑枚举法。
有了以上的基础我们便可以通过图示描述解题过程见求解过程示例图图12求解过程示例图东北师大附中我们把将段设为顶点所在段的最大分值设为顶点的权各顶点按自西向东的顺序相连组成一条游览路线
基本算法——枚举法
技术教研组 谷方明
整理ppt
1 示例
求满足表达式A+B=C的所有整数解,其 中A,B,C为1~3之间的整数。
o( r c ) d ( c c m N e 4 4 ) r o m 4 d c o c 0 0 d
整理ppt
结果
❖然后将P1,P2,…,P9代入下述三个检验 条件
C5=(P1+P3+P5+P7+P9) mod 4 C7=(P4+P7+P8) mod 4 C9=(P6+P8+P9) mod 4 ❖上述局部枚举的方法(枚举状态数为43个) 比较全部枚举的方法(枚举状态数为49个) 来说,由于大幅度削减了枚举量,减少运 算次数,因此其时效显著改善 (优化:依 赖关系)
整理ppt
优化
❖ P4~P9可直接由P1,P2,P3求出 P4=order(C1-P1-P2); P5=order(C2-P1-P2-P3); P6=order(C3-P2-P3); P7=order(C4-P1-P4-P5); P9=order(C6-P3-P5-P6); P8=order(C8-P5-P7-P9);
▪ 来自若干个连续的段,每一个段中取一个分值; ▪ 每一个分值是所在段中最大的; ▪ 起点段和终点段任意,但途经段的分值和最大。
整理ppt
❖ 设Li为第I个段中的分值最大的段。即Li=Max{L1I, L2I,……,LMI}(1≦I≦N – 1)。例如对于样 例数据: L1=Max(-50,17,-42)=17; L2=Max(-47,-19,-3)=-3; L3=Max(36,-34,-43)=36; L4=Max(-30,-13,34)=34; L5=Max(-23,-8,-45)=-8;
❖条件2: 你如果按D, A , E , C , B 来排列五人 名次的话, 其结果是: 说对了其中两个人的名次。 还猜中了两对名次相邻的学生的名次顺序。
整理ppt
❖分析:本题是一个逻辑判断题,一般的逻 辑判断题或推理题都采用枚举法进行解决。 5个人的名次分别可以有5!=120种排列可 能,因为120比较小,因此我们对每种情况 进行枚举,然后根据条件判断哪些符合问 题的要求。
整理ppt
❖本题目有9个格子,要求填数,如果不考虑 问题给出的条件,共有9!=362880种方案, 在这些方案中符合问题条件的即为解。因 此可以采用枚举法。
❖但仔细分析问题,显然第一行的数不会超 过400,实际上只要确定第一行的数就可以 根据条件算出其他两行的数了。这样仅需 枚举400次。(优化:解变量的依赖关系, 也叫局部枚举)
❖ 移动方案选取与顺序无关。样例中,最佳移动序列为5849,同样4589 序列也可达到目标。因此,求解过程中可以直接选取序列中从小至大 排列的移动序列即可。(优化:用顺序减少解集的元素)
❖ 每移动一次,时针将顺时针旋转90度。由此我们可以得出: 对于任意一个时钟i(1≦i≦9)来说,从初始位置j出发至少需要Ci= (4-j) % 4次操作,才能使得时针指向12点。而对每种移动方法要 么不采用,要么采用1次、2次或3次,因为操作四次以后,时钟将重 复以前状态。因此,9种旋转方案最多产生49个状态。(优化:用次 数减少解集的元素)
❖ 我们将网格状的旅游区街道以林荫道为界分为N – 1个段,每一段由M条旅游街的对应段成,即 第J段成为{L1J,L2J,……,LMJ}(1≦ J ≦ N – 1)。由于游览方向规定横向自西向东,纵向 即可沿林阴道由南向北,亦可由北向南,而横行 的街段有分值,纵行无分值,因此最佳游览路现 必须具备如下三个特征:
相关文档
最新文档