回 帖 发 新 帖 刷新版面

主题:[讨论]有关算法

大家好,上次请大家讨论了单元,今天就说说算法中的---穷举法把,大家各抒己见,谈谈他的用法,复杂性(复杂性是什么),应用范围……,谢谢各位![em12][em9][em16]

回复列表 (共5个回复)

沙发

复杂性包括时间复杂性,和空间复杂性```
顾名思义.时间复杂度就是花费的时间多少啦``
而空间复杂性就是所用资源的多少诶``

板凳

穷举法
                     
   穷举法是基于计算机特点而进行解题的思维方法。一般是在一时找不出解决问题的更好途径时,可以根据问题中的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。这种解决问题的方法我们称之为穷举算法。穷举法特点是算法简单,但运行时所花费的时间量大。有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。另外,穷举法解决问题时,应尽可能将明显的不符合条件的情况排队在外,以尽快取得问题的解。
穷举法模式:
       (1) 问题解的可能搜索的范围:用循环或循环嵌套结构实现;
       (2) 写出符合问题解的条件;
       (3) 能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。

3 楼

整数的性质-利用穷举法编程

教学目标:复习顺序法、逆算法,了解什么是穷举法,学习利用顺序法、逆算法和穷举法,熟练编写如下程序:

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 楼

呵呵`楼主是按字数给分的啊?稿费??

5 楼

楼上聪明,给你10分

我来回复

您尚未登录,请登录后再回复。点此登录或注册