穷举算法及解题

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

穷举算法及解题

穷举算法及解题

例12-1古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、

2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。问题分析

(1)本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数的本身;

(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。

程序如下:

program p12_1;

var a,b,s:integer;

begin

for a:=2to1000do

begin

s:=0;

for b:=1to a-1do

if a mod b=0then s:=s+b;

if a=s then begin

write(a,'=',1,);

for b:=2to a-1do

if a mod b=0then write('+',b);

writeln;

end;

end;

end.

当程序运行后,输出结果:

6=1+2+3

28=1+2+4+7+14

496=1+2+4+8+16+31+62+124+248

例12-3

邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。

问题分析:本题则是

知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最

大邮票。其算法是:

(1)面值不同的四种邮票,每封信所贴邮票不超过3张;

(2)用这四种邮票贴出连续的整数,并且使r值最大;

(3)用穷举法,找出所有符合条件的解;

(4)本题用集合的方法统计邮票的面值,提高判重的速度。设四种邮票的面值分别为:a,b,c,d,根据题意设:

a<b<c<d,因此a=1,用循环语句完成搜索。Program p12-3;

Var a,b,c,d:integer;

X,x0,x1,x2,x3,x4:integer;

st1:set of1..100;

function number(a,b,c,d:integer):integer;

var n1,n2,n3,n4,sum:integer;

begin

st1:=[];

for n1:=0to3do

for n2:=0to3-n1do

for n3:=0to3-n1-n2do

for n4:=0to3-n1-n2-n3do

begin

if n1+n2+n3+n4<=3then

begin

sum:=n1*a+n2*b+n3*c+n4*d;

st1:=st1+[sum];

end;

end;

sum:=1;

while sum in st1do

sum:=sum+1;

number:=sum-1;

end;

begin

a:=1;x0:=0;

for b:=a+1to3*a+1do

for c:=b+1to3*b+1do

for d:=c+1to3*c+1do

begin

x:=number(a,b,c,d);

if x>x0then

begin

x0:=x;x1:=a;x2:=b;x3:=c;x4:=d;

write(x1:5,x2:5,x3:5,x4:5);

writeln(‘’:10,’x0=’,x0);

end;

end;

end.

程序运行后,其输出结果是:

1234x0=12

1235x0=13

13610x0=23

1478x0=24

穷举法编程练习题目:

1、有一群鸡和一群兔,它们的只数相同,它们的脚数都是三位数,且这两个三位数的数字分别是0,1,2,3,4,5。问鸡和兔的只数各是多少?它们的脚数各是多少?-穷举法

2、有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且各位数字之和等于各位数字相乘之积,求此三位数。

分析:如果以A、B、C分别表示这个三位数的百位、十位和个位数字,由题意知B<A<C,由此做穷举

3、蜘蛛有8条腿,蜻蜓有6条腿和2对翅,蝉有6条腿和1对翅。三种

虫子共18共,共有118条腿和20对翅。问每种虫子各几只?

4、甲、乙两数的和为168,甲数的八分之一与乙数的四分之三的和为76,求甲、乙两数各是多少?

5、我国古代数学问题:1兔换2鸡,2兔换3鸭,5兔换7鹅。某人用20只兔换得鸡、鸭、鹅共30只,问其中鸡、鸭、鹅各几只?源程序:鸡兔问题:用穷举法,找出满足条件的鸡的脚数和兔的脚数,

其鸡的脚数百十个位上分别为a,b,c,其兔的脚数百十个位上分别为d,e,f,鸡的只数为x,兔的只数为y.为了减少循环判断的次数,我们把0-5各位数字都加上1变成1-6,所以在由各位数字组成脚数x,y时需要减去111。program jitu;

var

a,b,c,d,e,f,x,y:integer;

begin

for a:=2to6do

for b:=1to6do

for c:=1to6do

for d:=2to6do

for e:=1to6do

begin

f:=21-a-b-c-d-e;

if a*b*c*d*e*f=720then

begin

相关文档
最新文档