鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?
思路:
- 在不甚思考的情况下(每种鸡都可能有0-100只)凭直觉写出蛮力法求解百鸡问题的基本思路并编程实现
设鸡翁为x,鸡母为y,鸡雏为z
x=0 x<=100 循环一
y=0 y<=100 循环二
z=0 z<=100 循环三
X+y+z=100&&3x+5y+z/3==100&&z%3==0?
Yes:输出xyz
No:循环
- 缩小三种鸡数量可能的范围,优化算法,减少计算量,此时算法复杂度减少
鸡翁百钱最多买20只,鸡母最多买33只,鸡雏最多100只
X<=20
Y<=33
Z<=100
- 进一步优化算法,降低算法的复杂度
直接令z=100-x-y,取消一层循环
代码如下:
#include<stdio.h>
int main(){
int x,y,z;
printf("设鸡翁为x,鸡母为y,鸡雏为z\n");
for(x=0;x<=20;x++){
for(y=0;y<=33;y++){
z=100-x-y;
if(5*x+3*y+(100-x-y)/3==100&&z%3==0){
printf("x=%d ",x);
printf("y=%d ",y);
printf("z=%d\n",z);
}
else{
continue;
}
}
}
}
运行结果截图:
调整输入规模(如1000鸡1000钱问题、2000鸡2000钱问题等),观察并记录5组(每组多次运行取平均值)不同输入规模下任务1和任务3算法的运行时间:
小刘的实验总结:
(1)为什么不使用时间单位来表示时间复杂度。
因为用不同的计算机对同一种算法的程序的运行的时间也会不同,因此时间单位并不能准确的表示时间复杂度。时间复杂度理论旨在量化算法的内在时间需求,也就是算法对任何计算机的基本时间约束。
(2)对不同量级时间复杂度的直观认识。
对于O(logn)、O(n)、O(n^2)这三种复杂度来说,由他们的图像可知,n越大,他们相差就越大,O(logn)的程序所用时间相对于O(n)、O(n^2)这两种复杂度的程序就会快很多。