穷举(枚举)算法

   穷举法,或称为暴力破解法(名字来源于对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止)是程序设计中使用得最为普遍(并不是在被逼无奈时最后的狂吼)之一,它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。


用穷举算法解决问题,通常可以从两个方面进行分析:

一、问题所涉及的情况:问题所涉及的情况有哪些,情况的种数可不可以确定,候选答案的集合是一个计算机必须能够承受的。


二、答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。把这些条件描述出来。

只要把这两个方面分析好了,问题自然会迎刃而解。

只要把这两个方面分析好了,问题自然会迎刃而解。

例 1 :
  36 块砖, 36 人搬。男搬 4 ,女搬 3 ,两个小儿抬一砖。要求一次全搬完。问需男、女、小儿各若干?

分析 :
    题目要我们找出符合条件的男生、女生和小孩的人数。答案显然是一组数据。首先分析一下问题所涉及的情况。
    对于男生来说,至少要有一人;每个男生可以搬4块砖,那么36块砖最多9个男生足够,共有9种不同取值。同样,女生有12种不同取值。两个小孩抬一块砖,至少要有两个小孩,最多36个,并且小孩的人数必须是个偶数,所以小孩的人数可以取18种不同的值。

最坏情况下,男生、女生和小孩的人数可以是 9 × 12 × 18 = 1944 种不同组合。

知道了问题所涉及的情况有1944种,是个确定的数。接下来就要把它描述出来。
假设男生人数为 x ,女生人数为 y ,小孩人数为 z 。可以构建一个三重循环, x 、 y 、 z 的值必须要同时满足两个条件:
①总的工作量是 36 块砖,即: 4x+3y+z/2=36 ;
②需要的总人数是 36 人,即: x+y+z=36 。
把它描述出来就是: 4x+3y+z/2=36 and x+y+z=36 。

   满足这个条件的 x 、 y 、 z 的值就是问题的答案。我们可以在循环体里面对这个条件进行判断,源程序如下:

public class Meiju{
    public static void main(String[] args){
     for(int x=1;i<=9;i++)
      for(int y=1;i<=12;i++)
        for(int z=2;z<=36;i+=2)
         if((4*x+3*y+z/2==36)&&(x+y+z==36)
            System.out.println("男生="+x+" 女生="+y+" 小孩="+z);
    }
}


运行:
男生=3 女生=3 小孩=30

例2:
    下面是一个填写数字的模板,其中每个字都代表数字中的”0~9“,那么要求我们输入的数字能够满足此模板。
穷举(枚举)算法

思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,最后只好"暴力"了
public class MeijuTest {  
  public static void main(String args[]) {  
     String father = null;  
     String mother = null;  
     String son = null;  
        int[] a = { 111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999 };  
        int[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
        for (int i = 0; i < a.length; i++) {  
            for (int j = 0; j < b.length; j++) {  
                father = a[i] / b[j] + "";  
                mother = b[j] + "";  
                son = a[i] + "";  
                if ((father.charAt(0) == mother.charAt(0)) && (father.charAt(4) == son.charAt(0)) && (father.length() == 5)) {  
                    System.out.println(" " + father);  
                    System.out.println("X    " + mother);  
                    System.out.println("-------");  
                    System.out.println(son);  
                    System.out.println();  
                    System.out.println("费了:" + ((i + 1 - 1) * 9 + (j + 1)) + "次,TMD终于找出来了!");  
                }  
            }  
        }  
  
    }  
}  

运行结果:

79365
X    7
-------
555555

费了:43次,TMD终于找出来了!
下载源码。

你可能感兴趣的:(java,数据结构,编程,算法)