【问题】已知公鸡 5 元一只,母鸡 3 元一只,小鸡 1 元三只,用 100 元钱买 100 只鸡,问公鸡、母鸡、小鸡各多少只?
【想法】设公鸡、母鸡和小鸡的个数分别为 、 和 ,则有如下方程组成立:
则百元买百鸡问题转换为求方程组的解。应用蛮力法求方程组的解只能依次试探变量 、 和 的值,验证 、 和 的某个特定值是否能够使方程组成立。
【算法】设变量 表示公鸡的个数, 表示母鸡的个数, 表示小鸡的个数,注意到方程组可能有多个解,需要输出所有满足条件的解,设变量 count 表示解的个数,算法用伪代码描述如下。
算法3.1:百元买百鸡问题
输入:无
输出:公鸡、母鸡和小鸡的个数
1.初始化解的个数 count=0 ;
2.循环变量 从 0~20 重复执行下述操作:
2.1 循环变量 从 0~33 重复执行下述操作:
2.1.1 ;
2.1.2 如果 等于 100,则 count++;输出 、 和 的值;
2.1.3 ++;
2.2 ++;
3.如果 count 等于0,则输出无解信息;
【算法分析】算法由两层嵌套的循环组成,可以将判等操作 ( 等于 100) 作为基本语句,其执行次数为 21×34=714 。
【算法实现】注意到小鸡 1 元三只,则小鸡的个数应该是 3 的倍数,因此,在判断总价是否满足方程时要先判断 是否是 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版)——王红梅 胡明 编著——清华大学出版社