百鸡问题
“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”
1:在不甚思考的情况下(每种鸡都可能有0-100只)凭直觉写出蛮力法求解百鸡问题的基本思路并编程实现,思考该算法复杂度的渐进表达式。
#include<stdio.h>
#include <time.h>
int 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*5+y*3+z/3==100&&x+y+z==100)
printf("公鸡%d只,母鸡%d只,小鸡%d只\n",x,y,z);
}
}
2:缩小三种鸡数量可能的范围,优化算法,减少计算量,此时算法复杂度是否减少?
#include<stdio.h>
#include <time.h>
int main()
{
int x,y,z;
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
{
z=3*(100-5*x-3*y);
if(x*5+y*3+z/3==100&&x+y+z==100)
printf("公鸡%d只,母鸡%d只,小鸡%d只\n",x,y,z);
}
}
3:进一步优化算法,能否降低算法的复杂度?请写出思路并编程实现。
#include<stdio.h>
#include <time.h>
int main()
{
int x,y,z;
for(x=0;x<=20;x++)
{
y=(100-7*x)/4;
z=100-x-y;
if(x>0&&y>0&&x*5+y*3+z/3==100&&x+y+z==100)
printf("公鸡%d只,母鸡%d只,小鸡%d只\n",x,y,z);
}
}