百钱买百鸡问题
穷举法举例
求解“百钱买百鸡”问题:公鸡每只5钱,母鸡每只3钱,小鸡3只1钱。
求解思路:设公鸡数为x,母鸡数为y,小鸡数为z,则可以得到下面的整数不定方程组:
x+y+z==100
5x+3y+z/3==100
利用穷举法可以写出下面的算法程序:
#include<stdio.h>
void main()
{
int x,y,z;
for(x=0;x<=100;x++)
{
for(y=0;y<=100;y++)
{
for(z=0;z<=100;z++)
{
if(x+y+z==100&&5*x+3*y+z/3==100)
{
printf("公鸡=%d 母鸡=%d 小鸡=%d\n",x,y,z);
}
}
}
}
}
执行结果
虽然上述程序很简单,但分析一下可知,此程序为三重循环,循环次数为1013=1030301,为106量级。如果改为“万钱买万鸡”,循环次数将达到10^12量级,计算量太大,这正是穷举法的缺点。
为此,可以考虑对程序做优化。例如,针对“百钱买白鸡“问题,如果用所有的钱去买公鸡,最多可以买20只,而用所有的钱去买母鸡,最多可买33只,所以x,y的值范围就可限定在20和33。这样,z的值就自然确定了,而不再是一个变量,可剪去第三层循环。
与上面程序等效的程序:
#include<stdio.h>
void main()
{
int x,y,z;
for(x=0; x<=20; x++)
{
for(y=0; y<=33; y++)
{
z=100-x-y;
if(5*x+3*y+z/3==100)
{
printf("公鸡=%d 母鸡=%d 小鸡=%d\n",x,y,z);
}
}
}
}
执行结果
这个程序的循环次数只有21*34=714。