算法思想——穷举 (用java语言实现 鸡兔同笼问题,韩信点兵问题等)

穷举算法(Exhaustive Attack method):是一种最简单的算法,依赖于计算机强大的计算能力,来穷尽每一种可能的情况,从而解决问题。

简单的说 :穷举法就是用循环把各种可能的情况都给走一遍,然后用if条件把满足要求的结果给筛选出来。

适用场景:穷举算法效率不高,适合于一些没有明显规律可循的场合。

穷举算法的基本思想

  1. 对于一种可能的情况,计算其结果。
  2. 判断结果是否满足要求,如果不满足,则执行第(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+"个。");
                    }
                }
            }
        }
    }
}

执行结果如下图所示:(执行结果有很多种,在此未显示完)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cui_yonghua/article/details/92397417