穷举(枚举)算法

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


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

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


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

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

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

例 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“,那么要求我们输入的数字能够满足此模板。
[img]http://dl.iteye.com/upload/attachment/0074/2110/2d428465-291c-3e24-906c-ef06467e5630.png[/img]

思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,最后只好"暴力"了

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终于找出来了!
下载源码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值