穷举法详细Word文档下载推荐.docx
- 文档编号:15016185
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:12
- 大小:26.20KB
穷举法详细Word文档下载推荐.docx
《穷举法详细Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《穷举法详细Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
Fora:
=2to1000do
Begin
S:
=0;
Forb:
=1toa-1do
Ifamodb=0thens:
=s+b;
{分解因子并求和}
Ifa=sthenbegin
Write(a,‘=’,1,);
=2toa-1do
Ifamodb=0thenwrite(’+’,b);
Writeln;
End;
End.
当程序运行后,输出结果:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
实例二:
(第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题)
在A,B两个城市之间设有N个路站(如下图中的S1,且N<
100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。
A,B的一条通路是指:
从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,…最后到达B。
通路上路段距离之和称为通路距离(最大距离≤1000)。
当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。
例如:
下图所示是当N=1时的情况:
从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。
算法说明:
本题采用穷举算法。
数据结构:
N:
记录A,B间路站的个数
数组D(I,0)记录第I-1到第I路站间路段的个数
D(I,1),D(I,2),…记录每个路段距离
数组G记录可取到的距离
PROGRAMCHU7_6;
VARI,J,N,S:
INTEGER;
B:
ARRAY[0..100]OFINTEGER;
D:
ARRAY[0..100,0..20]OFINTEGER;
G:
ARRAY[0..1000]OF0..1;
BEGIN
READLN(N);
FORI:
=1TON+1DO
BEGIN
READLN(D[I,0]);
FORJ:
=1TOD[I,0]DO
READLN(D[I,J]);
END;
D[0,0]:
=1;
FORI:
=1TON+1DO
B[I]:
B[0]:
=0;
=0TO1000DO
G[I]:
WHILE ① DO
BEGIN
S:
FORI:
S:
= ②
G[S]:
J:
=N+1;
WHILE ③ DOJ:
=J-1;
B[J]:
=B[J]+1;
=J+1TON+1DO
END;
S:
=1TO1000DO
④ ;
WRITELN(S);
READLN;
END.
答案:
①B[0]=0
②S+D[I,B[I]];
③B[J]=D[J,0]④S:
=S+G[I]
实例三(第八届全国青少年信息学奥林匹克联赛(NOIP2002)试题)
将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
b,d:
[0..100]
s
array[1..30]
begin
readln(n,k);
for
I:
=1
to
n
do
read(a[I]);
=0
b[I]:
=1;
cmin:
=1000000;
while
(b[0]=1)
do
begin
for
k
①
②
sum:
=0;
k-1
j:
=
③
=sum+(s[I]-s[j])*(s[I]-s[j]);
if
④
then
=sum;
d[I]:
=b[I];
end;
j:
=n;
⑤
=j-1;
b[j]:
=b[j]+1;
=j+1
⑥
writeln(cmin);
write(d[I]:
40);
writeln;
end.
四、穷举算法的深入应用
一根29厘米长的尺子,只允许在上面刻七个刻度,要能用它量出1~29厘米的各种长度。
试问这根尺的刻度应该怎样选择?
(1)从1~29厘米中选择七个刻度的所有可能情况数是:
C729=29·
28·
26·
25·
24·
23=29·
9·
5·
2·
23=29·
23·
90=1560780
1·
3·
4·
6·
7
(2)对于每一组刻度的选择都需要判断是否能将1~29厘米的各种刻度量出来,例如选择的刻度为:
a1,a2,a3,a4,a5a,6,a7那么能量出的刻度为:
a1,29-a1;
2
a2,a2-a1,29-a2;
3
a3,a3-a1,a3-a2,29-a3;
4
a4,a4-a1,a4-a2,a4-a3,29-a4;
5
a5,a5-a1,a5-a2,a5-a3,a5-a4,29-a5;
6
a6,a6-a1,a6-a2,a6-a3,a6-a4,a6-a5,29-a6;
7
a7-a1,a7-a2,a7-a2,a7-a3,a7-a4,a7-a5,a7-a6,29-a7;
8
共可量出2+3+4+5+6+7+8种刻度,即35种刻度,事实上其中有许多刻度是重复的,不可能复盖1~29。
取a1,a2,a3,a4,a5,a6,a7为1,3,6,10,15,21,28
能量出的刻度为:
1,28
3,2,26
6,5,3,23
10,9,7,4,19
15,14,12,9,5,14
21,20,18,15,11,6,8
28,27,25,22,18,13,7,1
缺16,17,24(29即尺子长度)
如果找出了刻度a1,a2,a3,a4,a5,a6,a7那么我们可以利用其对称性29-a1,29-a2,29-a3,29-a4,29-a5,29-a6,29-a7,也是一组解,所以求解过程中可仅考虑a1<
a2<
a3<
a4<
a5<
a6<
a7的情况。
很显然要使1,28两种刻度能量出来,则在七个刻度就必须有1或28;
这样就可设a1=1(或a1=28)。
本题就变成了只要在2~27中选取六个刻度问题了。
其刻度选择的数目为C626=26·
22·
21=26·
11·
7=230230
1·
6
这样解的范围就从百万变成了十万的数量级,大大减少运行次数。
因此,我们在用穷举法求问题解时,应注意程序的优化,尽可能减少搜索时间。
{程序优化}
(3)为了判定七个刻度是否能够度量1~29的所有长度,可以用集合的方法,也可以用数组的0,1数据判断。
下面的程序使用了数组的0,1方法。
Programp12_2;
Constn=29;
m=1;
Vara:
array[1..7]ofinteger;
b:
array[1..n]of0..1;
{记录能量的刻度}
f:
Boolean;
I,j:
integer;
BEGIN
a[1]:
=m;
fora[2]:
=2ton-7do
fora[3]:
=a[2]+1ton-6do
fora[4]:
=a[3]+1ton-5do
fora[5]:
=a[4]+1ton-4do
fora[6]:
=a[5]+1ton-3do
fora[7]:
=a[6]+1ton-2do
fori:
=1to29dob[i]:
fori:
=1TO7do
begin
b[a[i]]:
b[n-a[i]]:
b[n]:
=1;
{初始化}
forj:
=i+1TO7dob[abs(a[j]-a[i])]:
=1
=0;
f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 穷举 详细