| | 网站首页 | 信息中心 | 下载中心 | 中心论坛 | 信息学竞赛 | 兴趣学习 | 在线课堂 | | |
![]() |
|
| 您现在的位置: 高要一中信息中心 >> 信息学竞赛 >> 算法设计 >> 正文 |
|
|||||||||
| 第六章 穷举(枚举)策略(PASCAL) | |||||||||
作者:missyou 文章来源:本站原创 点击数: 更新时间:2008-9-28 ![]() |
|||||||||
|
所谓枚举法,指的是从可能的解的集合中一一枚举各元素, 用题目给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立,即为其解。 有些问题可以用循环语句和条件语句直接求解,有些问题用循环求解时循环次数太多,无法编写程序,怎么办?下面是用“千军万马过独木桥,适者存”的方式实现穷举策略的。
例2:在A、B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数<=20,且每条路段上的距离均为一个整数)。
从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。 算法说明:本题采用穷举算法。 练习: 1。问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,……sk,定义整数P为: P=(S1-S2)2+(S1一S3)2+……+(S1-Sk)2+(s2-s3)2+……+(Sk-1-Sk)2 问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉 程序说明: 数组:a[1],a[2],...A[N]存放原数 s[1],s[2],...,s[K]存放每个部分的和 b[1],b[2],...,b[N]穷举用临时空间 d[1],d[2],...,d[N]存放最佳方案 程序: program exp4; Var i,j,n,k : integer; a :array [1..100] of integer; b,d:array [0..100] of integer; s :array[1..30] of integer; begin readln(n,k); for I:=1 to n do read(a[I]); for I:=0 to n do b[I]:=1; cmin:=1000000; while (b[0]=1) do begin for I:=1 to k do ① for I:=1 to n do ② sum:=0; for I:=1 to k-1 do for j:= ③ sum:=sum+(s[I]-s[j])*(s[I]-s[j]); if ④ then begin cmin:=sum; for I:=1 to n do d[I]:=b[I]; end; j:=n; while ⑤ do j:=j-1; b[j]:=b[j]+1; for I:=j+1 to n do ⑥ end; writeln(cmin); for I:=1 to n do write(d[I]:40); writeln; end. 2.问题描述:有n种基本物质(n≤10),分别记为P1,P2,……,Pn,用n种基本物质构造物品,这些物品使用在k个不同地区(k≤20),每个地区对物品提出自己的要求,这些要求用一个n 位的数表示:α1α2……αn,其中: αi =1表示所需物质中必须有第i种基本物质 =-1表示所需物质中必须不能有第i种基本物质r =0无所谓 问题求解:当k个不同地区要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质不被使用。 程序说明:数组b[1],b[2],...,b[nJ表示某种物品 a[1..k,1..n]记录k个地区对物品的要求,其中: a[I,j]=1表示第i个地区对第j种物品是需要的 a[i,j]=0表示第i个地区对第j种物品是无所谓的 a[i,j]=-1表示第i个地区对第j种物品是不需要的 程序: program gxp2; Var i, j ,k, n :integer; p:boolean; b :array [0..20] of 0..1; a :array[1..20,1..10]d integer; begin readln(n,k); for i:=1 to k do begin for j:=1 to n do read(a[i,j]); readln; end; for i:=O to n do b[i]:=0; p:=true; while ① do begin j:=n; while b[j]=1 do j:=j-1; ② for i:=j+1 to n do b[I]:=0; ③ for i:=1 to k do for j :=1to n do if( a[i,j]=1 ) and (b[j]=0) or ④ then p:=true; end; if ⑤ then writeln('找不到!‘) else for i:=1 to n do if (b[i]=1) then writeln('物质',I,’需要') else writeln('物质',i,'不需要'); end.
|
|||||||||
| 文章录入:missyou 责任编辑:missyouadmin | |||||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
| 高要一中信息中心 站长:苏永权 | |