算法设计与分析——百元买百鸡问题(Java)

【问题】已知公鸡 5 元一只,母鸡 3 元一只,小鸡 1 元三只,用 100 元钱买 100 只鸡,问公鸡、母鸡、小鸡各多少只?

【想法】设公鸡、母鸡和小鸡的个数分别为 x 、y 和 z ,则有如下方程组成立:
 

则百元买百鸡问题转换为求方程组的解。应用蛮力法求方程组的解只能依次试探变量 x 、y 和 z 的值,验证 x 、y 和 z 的某个特定值是否能够使方程组成立。
【算法】设变量 x 表示公鸡的个数,y 表示母鸡的个数,z 表示小鸡的个数,注意到方程组可能有多个解,需要输出所有满足条件的解,设变量 count 表示解的个数,算法用伪代码描述如下。

算法3.1:百元买百鸡问题

输入:无

输出:公鸡、母鸡和小鸡的个数

1.初始化解的个数 count=0 ;

2.循环变量 x 从 0~20 重复执行下述操作:

    2.1  循环变量 y 从 0~33 重复执行下述操作:

        2.1.1  z=100-x-y

        2.1.2  如果5*x+3*y+z/3 等于 100,则 count++;输出x 、y 和 z 的值;

        2.1.3  y++;

    2.2  x++;

3.如果 count 等于0,则输出无解信息;

【算法分析】算法由两层嵌套的循环组成,可以将判等操作 (5*x+3*y+z/3 等于 100) 作为基本语句,其执行次数为 21×34=714 。

【算法实现】注意到小鸡 1 元三只,则小鸡的个数应该是 3 的倍数,因此,在判断总价是否满足方程时要先判断 z 是否是 3 的倍数。算法用JAVA语言描述如下:

public class BuyChicken {
    void Chicken( )
    {
        int x, y, z;                //x、y和z分别表示公鸡、母鸡和小鸡的个数
        int count = 0;                          //解的个数初始化为0
        for (x = 0; x <= 20; x++)                 //公鸡个数x的范围是0到20
        {
            for (y = 0; y <= 33; y++)               //母鸡个数y的范围是0到33
            {
                z = 100 - x - y;                    //满足方程x + y + z = 100
                if ((z % 3 == 0) && (5 * x + 3 * y + z/3 == 100))  //满足总价是100元
                {
                    count++;                       //解的个数加1
                    System.out.println("公鸡的个数是:"+x);
                    System.out.println("母鸡的个数是:"+y);
                    System.out.println("小鸡的个数是:"+z);
                }
            }
        }
        if (count == 0)
            System.out.println("问题无解");;
    }
    public static void main(String args[]){
        BuyChicken mj=new BuyChicken();
        mj.Chicken();
    }
}

运行结果如下:


from:算法设计与分析(第2版)——王红梅 胡明 编著——清华大学出版社

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值