穷举算法(Exhaustive Attack method):是一种最简单的算法,依赖于计算机强大的计算能力,来穷尽每一种可能的情况,从而解决问题。
简单的说 :穷举法就是用循环把各种可能的情况都给走一遍,然后用if条件把满足要求的结果给筛选出来。
适用场景:穷举算法效率不高,适合于一些没有明显规律可循的场合。
穷举算法的基本思想:
- 对于一种可能的情况,计算其结果。
- 判断结果是否满足要求,如果不满足,则执行第(1)步来搜索下一个可能的情况;如果满足要求,则表示找到正确答案。
下面来用一个例子来实现穷举算法:
鸡兔同笼问题:
一个笼子里关有鸡兔共35头,一共94只脚,笼中鸡兔各有多少只。
分析:鸡的数量应该在0~35之间。代码如下:
import java.util.Scanner;
/**
* 鸡兔同笼问题
* 一个笼子里关有鸡兔共35头,一共94只脚,笼中鸡兔各有多少只。
*/
public class Example {
static int chicken,habbit; //chicken代表鸡的个数,habbit代表兔的个数
public static int qiongJu (int head,int foot) { //穷举算法
int re,i,j;
re = 0;
for(i=0;i <= head;i++) {
j = head-i;
if(i*2 + j*4 ==foot){//判断,找到答案
re=1;
chicken = i;
habbit = j;
}
}
return re;
}
public static void main(String[] args) {
int re,head,foot;
System.out.println("用穷举发求解鸡兔同笼的问题:");
Scanner input = new Scanner(System.in);
System.out.print("请输入的头的数量:");
head = input.nextInt();
System.out.print("请输入脚的数量:");
foot = input.nextInt();
re = qiongJu(head,foot);
if(re == 1){
System.out.println("鸡有"+chicken+"只,兔有"+habbit+"只。");
}else {
System.out.println("无法求解!");
}
}
}
执行结果如下图所示:
下面都是穷举法相关的例子:
1. 韩信点兵问题
韩信知道部队人数大约1000人左右,具体数字不详,5人一组剩余1人,7个人一组还剩两个人,8个人一组还剩3个人,问:这支部队有多少人?
代码如下:
/**
* 韩信点兵问题
*/
public class Example {
public static void main(String[] args) {
for(int i=0;i<=2000;i++)
{
if(i%5==1 && i%7==2 && i%8==3)
{
System.out.println(i);
}
}
}
}
执行结果如下图所示:
2. 找出100以内的与7有关的数。
/**
* 找出100以内的与7有关的数。
*/
public class Example {
public static void main(String[] args) {
for(int a=1;a<100;a++) {
if(a%7==0 || a%10==7 || a/10==7) {
System.out.print(a+"\t");
}
}
}
}
执行结果如下图所示:
3. 有三种硬币若干:1分,2分,5分。要组合1毛5,有哪些组合方式?
/**
* 有三种硬币若干:1分,2分,5分。要组合1毛5,有哪些组合方式?
*/
public class Example {
public static void main(String[] args) {
for(int a=0;a<=15;a++) {//一分的硬币最多有15个
for(int b=0;b<=7;b++) {//二分的硬币最多有7个
for(int c=0;c<=3;c++) {//五分的硬币最多有3个
if(a*1+b*2+c*5 == 15) {
System.out.println("一分钱的硬币需要"+a+"个," +
"两分钱的硬币需要"+b+"个,五分钱的硬币需要"+c+"个。");
}
}
}
}
}
}
执行结果如下图所示:
4. 小张有100元,他要买香皂(5元),牙刷(2元),洗发水(20元)。要想把100元正好花完,并且只买一瓶洗发水,如何买这三样东西?
/**
* 小张有100元,他要买香皂(5元),牙刷(2元),洗发水(20元)。
* 要想把100元正好花完,并且只买一瓶洗发水,如何买这三样东西?
*/
public class Example {
public static void main(String[] args) {
for(int a=0;a<=20;a++) {
for(int b=0;b<=50;b++) {
if(a*5+b*2+20 == 100) {
System.out.println("香皂"+a+"块,牙刷" +b+"个。");
}
}
}
}
}
执行结果如下图所示:
5. 百鸡买百钱。有100文钱,要买100只鸡回家。公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只。如何买?
/**
* 白钱买百鸡
*/
public class Example {
public static void main(String[] args) {
for(int a=0;a<=50;a++) {
for(int b=0;b<=100;b++) {
for(int c=0;c<=200;c++) {
if(a*1+b+c*0.5 == 100 && a+b+c==100) {
System.out.println("公鸡"+a+"个,母鸡"+b+"个,小鸡"+c+"个。");
}
}
}
}
}
}
执行结果如下图所示:(执行结果有很多种,在此未显示完)