穷举算法及解题


穷举算法及解题



例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:=2 to 1000 do
begin
s:=0;
for b:=1 to a-1 do
if a mod b =0 then s:=s+b;
if a=s then begin
write(a,'=',1,);
for b:=2 to a-1 do
if a mod b=0 then 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 of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
 st1:=[];
 for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
if n1+n2+n3+n4<=3 then
begin
sum:=n1*a+n2*b+n3*c+n4*d;
st1:=st1+[sum];
end;
end;
sum:=1;
while sum in st1 do
sum:=sum+1;
number:=sum-1;
end;
begin
a:=1;x0:=0; 
for b:=a+1 to 3*a+1 do

for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
x:=number(a,b,c,d);
if x>x0 then
begin
x0:=x;x1:=a;x2:=b;x3:=c;x

4:=d;
write(x1:5,x2:5,x3:5,x4:5);
writeln(‘’:10,’x0=’,x0);
end;
end;
end.
程序运行后,其输出结果是:
1 2 3 4 x0=12
1 2 3 5 x0=13
1 3 6 10 x0=23
1 4 7 8 x0=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:=2 to 6 do
for b:=1 to 6 do
for c:=1 to 6 do
for d:=2 to 6 do
for e:=1 to 6 do
begin
f:=21-a-b-c-d-e;
if a*b*c*d*e*f=720 then
begin
x:=100*a+10*b+c-111;
y:=100*d+10*e+f-111;
if (2*x=y) and (x / 2=trunc(x /2)) then
writeln(x div 2,' ',x,' ',y)
end;
end;
end.

数字问题:分析:如果以A、B、C分别表示这个三位数的百位、十位和个位数字,由题意知B<A<C,由此做穷举 program geshibai;
var
a,b,c:integer;
begin
for b:=1 to 7 do
for a:=b+1 to 8 do
for c:=a+1 to 9 do
if a+b+c=a*b*c then
writeln(a*100+b*1
0+c) ;
end. program zhizhu;
var
x,y,z:integer;
begin
for x:=1 to 16 do
for y:=1 to 16 do
begin
z:=18-x-y;
if (8*x+6*y+6*z=118) and (2*y+z=20) then
writeln(x,' ',y,' ',z);
end;
end. program n1n2;
var
x,y:integer;
begin
for x:=1 to 168 do
begin
y:=168-x;
if x/8+y*3/4=76 then
writeln(x,' ',y);
end;
end. program jtye;
var
x,y,z:integer;
begin
for x:=7 to 28 do
for y:=3 to 30-x do
begin
z:=30-x-y;
if x/2+y/3*2+z/7*5=20 then
writeln(x,' ',y,' ',z);
end;
end.



相关主题
相关文档
最新文档