穷举法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
培养学生自主建构的意识和能力
1、不应对蕴含穷举思想的问题求解抱通过了事的心态。 、不应对蕴含穷举思想的问题求解抱通过了事的心态。 2、而应基于异中求同的思Hale Waihona Puke Baidu,把蕴含穷举思想的问题 、而应基于异中求同的思维, 纳入穷举法的算法系统中来,引导、培养学生自主 纳入穷举法的算法系统中来,引导、 建构信息学知识系统的意识和能力。 建构信息学知识系统的意识和能力。 3、现状。平时做大量试题,比赛时却对类似问题的算 、现状。平时做大量试题, 法确定犹豫不决。知识系统建构不完善的结果。 法确定犹豫不决。知识系统建构不完善的结果。
【例2】二元一次方程组求解。编程对下列方程组 例 求解(X、Y均为自然数)。
算法结构
核心程序段
x:=1;f:=false; while (x<=13) and (not f) do begin y:=1; while (y<=13) and (not f) do if (2*x+3*y=13) and (3*x-y=3) then begin write('x=',x,' y=',y);f:=true;end else y:=y+1; x:=x+1; end;{while x<=13}
解分量有多个的情况
由于一重循环只能穷举问题解的一个解分量, 由于一重循环只能穷举问题解的一个解分量, 所以当问题解的分量有多个时, 所以当问题解的分量有多个时,就需要用多 重循环嵌套来穷举问题解的所有分量。 重循环嵌套来穷举问题解的所有分量。一般 的处理方法是一层循环穷举一个分量, 的处理方法是一层循环穷举一个分量,如果 个分量, 重循环嵌套。 有3个分量,就需要 重循环嵌套。 个分量 就需要3重循环嵌套
二维组合式穷举
【例4】邮票问题1。邮局发行一套有4种不 例 同面值的邮票,如果限制每封信所贴的邮 票张数不能超过3枚。存在整数R,使得用 不超过3枚的邮票可以贴出一下连续序列: 1,2,3,4,5,......,R。 编程求出可以得到尽可能大的R值以及对 应的4种邮票面值。
大致算法结构
细化后的程序结构
穷举法
穷举法的概念
穷举法也叫枚举法, 穷举法也叫枚举法,它的基本思想是按照 问题要求确定问题解的大致范围, 问题要求确定问题解的大致范围,然后在 此范围内对这些解进行一一列举, 此范围内对这些解进行一一列举,再对当 前列举出的解进行是否满足问题要求的判 最后把符合要求的解输出, 断,最后把符合要求的解输出,直到所有 可能解全部列举完毕。 可能解全部列举完毕。
IF R=R1 THEN BREAK; END; IF R=R1 THEN BREAK; END; IF R<>R1 THEN BREAK; END; R:=R-1;
初识穷举法
穷举法算法结构 按照问题解的特征可以分为“解分量只有 按照问题解的特征可以分为“ 一个” 解分量有多个”二类。 一个”和“解分量有多个”二类。所谓解 分量个数指的是问题解包含特征参数的个 数。
解分量只有一个的情形
这种情形的问题求解由于只有一个解分量, 这种情形的问题求解由于只有一个解分量, 程序结构相对简单。由于只有一个解分量, 程序结构相对简单。由于只有一个解分量, 所以就可用一重循环来穷举所有的可能值, 所以就可用一重循环来穷举所有的可能值, 然后进行条件判断。 然后进行条件判断。
rmax:=0;s1:=1; for s2:=2 to 10 do for s3:=3 to 10 do for s4:=4 to 10 do begin 计算R值; IF R>RMAX THEN BEGIN RMAX:=R;记录对应的S1,S2,S3,S4; END; end;
计算某个解对应的连续最大R值
FOR R:=1 TO 3*S4 DO BEGIN FOR N1:=0 TO 3 DO BEGIN FOR N2:=0 TO 3-N1 DO BEGIN FOR N3:=0 TO 3-N1-N2 DO BEGIN FOR N4:=0 TO 3-N1-N2-N3 DO BEGIN R1:= N1*S1+N2*S2+N3*S3+N4*S4; IF R=R1 THEN BREAK; END; IF R=R1 THEN BREAK; END;
),输出 【例1】输入一个自然数 (N>2),输出 】输入一个自然数N( ), 1到N之间所有的质数。 之间所有的质数。 到 之间所有的质数
算法结构
子程序
function zs(j:integer):boolean; var k:integer; f:boolean; begin f:=false; k:=2; while (k<=sqrt(j)) and not(f) do begin if trunc(j/k)=j/k then f:=true else k:=k+1; end; zs:=not(f); end;