主题:[讨论]有关算法
stuart920106
[专家分:730] 发布于 2005-08-07 10:50:00
大家好,上次请大家讨论了单元,今天就说说算法中的---穷举法把,大家各抒己见,谈谈他的用法,复杂性(复杂性是什么),应用范围……,谢谢各位![em12][em9][em16]
回复列表 (共5个回复)
沙发
MagicG [专家分:650] 发布于 2005-08-08 08:52:00
复杂性包括时间复杂性,和空间复杂性```
顾名思义.时间复杂度就是花费的时间多少啦``
而空间复杂性就是所用资源的多少诶``
板凳
闪电123 [专家分:470] 发布于 2005-08-08 11:32:00
穷举法
穷举法是基于计算机特点而进行解题的思维方法。一般是在一时找不出解决问题的更好途径时,可以根据问题中的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。这种解决问题的方法我们称之为穷举算法。穷举法特点是算法简单,但运行时所花费的时间量大。有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。另外,穷举法解决问题时,应尽可能将明显的不符合条件的情况排队在外,以尽快取得问题的解。
穷举法模式:
(1) 问题解的可能搜索的范围:用循环或循环嵌套结构实现;
(2) 写出符合问题解的条件;
(3) 能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
3 楼
闪电123 [专家分:470] 发布于 2005-08-08 11:33:00
整数的性质-利用穷举法编程
教学目标:复习顺序法、逆算法,了解什么是穷举法,学习利用顺序法、逆算法和穷举法,熟练编写如下程序:
1父子年龄之和是50岁,再过5年父亲的年龄是儿子的4倍,父亲和和儿子现在各是多少岁?[43,7]-顺序法
2、A,B,C 三人分24只苹果,每人所得个数等于三年前他们的年龄数。如果C把所得苹果的一半分给A和B;然后B再把现有苹果的一半分给A和C,最后A再把再有苹果的一半分给B和C,这时每人的恰好相等,求现在三人的年龄各是多少岁?[16,10,7]-逆算法
3、今有红(R)、黄(Y)、绿(G)、蓝(B)四面旗子,每次取四面从上到下挂出,可以有多少种不同的挂法?分别打印出来。-穷举法
过程:
一、什么是顺序法和逆算法:
我们在分析题目或编程时,大致有两种思路: 一种是按照数学运算过程或事物变化过程的顺序编程;一种完全与数学过程或事物变化过程相反的顺序编程,我们把第一种编程方法叫做“顺序法”,后一种方法叫做“逆算法”。
二、什么是穷举法:
利用计算机运行速度极快的特点,在题目所给的条件下,将各种可能出现的情况一一去试着验证,直到出现符合韪条件要求的答案。
二、编程
1、3、今有红(R)、黄(Y)、绿(G)、蓝(B)四面旗子,每次取四面从上到下挂出,可以有多少种不同的挂法?分别打印出来。
分析:
1、题意: 红黄绿蓝、红黄蓝绿、红绿黄蓝、红绿蓝黄……共有24种排列方法
2、我们可以采取多层循环来实现排列列举。
program flag;
var
a:array[1..4] of char;
s,i,j,k,l:integer;
begin
a[1]:='b';
a[2]:='g';
a[3]:='r';
a[4]:='y';
for i:=1 to 4 do
for j:=1 to 4 do
if i<>j then
for k:=1 to 4 do
if (j<>k)and(i<>k) then
for l:=1 to 4 do
if (k<>l) and (i<>l) and(j<>l) then
begin
write(a[i],a[j],a[k],a[l],' ');
s:=s+1;
end;
writeln(s);
end.
program p1;
var
a,b:integer;
begin
while (a+5)*4<>b+5 do
begin
a:=a+1;
b:=50-a;
end;
writeln(a, ' ', b) ;
end.
program p2;
var
a,b,c:integer;
begin
a:=24 div 3; b:=a;c:=a;
b:=b - a div 2; c:=c- a div 2; a:=a*2;
a:=a - b div 2; c:=c - b div 2; b:=b*2;
b:=b - c div 2; a:=a - c div 2; c:=c*2;
a:=a+3;b:=b+3;c:=c+3;
writeln(a,' ',b,' ' ,c)
end.
鸡兔问题:用穷举法,找出满足条件的鸡的脚数和兔的脚数, 其鸡的脚数百十个位上分别为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*10+c) ;
end.
4 楼
MagicG [专家分:650] 发布于 2005-08-11 10:22:00
呵呵`楼主是按字数给分的啊?稿费??
5 楼
stuart920106 [专家分:730] 发布于 2005-08-11 14:57:00
楼上聪明,给你10分
我来回复