实验主题:从蛮力到策略
(1)百鸡问题
“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”
- 在不甚思考的情况下(每种鸡都可能有0-100只)凭直觉写出蛮力法求解百鸡问题的基本思路并编程实现,思考该算法复杂度的渐进表达式。
设鸡翁为x,鸡母为y,鸡雏为z,x,y,z从0依次循环到100,满足5x+3y+1/3z=100,x+y+z=100的条件则有解。
- 缩小三种鸡数量可能的范围,优化算法,减少计算量,此时算法复杂度是否减少?
是有减少
- 进一步优化算法,能否降低算法的复杂度?请写出思路并编程实现。
减少循环,降低复杂度,减少未知数,y=(100-7*x)/4;
z=100-x-y;
代码粘贴区:
1.
#include<iostream>
using namespace std;
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+y+z==100&&5*x+3*y+z/3==100&&z%3==0)
{
cout<<"公鸡数="<<x
<<" 母鸡数="<<y
<<" 小鸡数="<<z
<<endl;
};
};
return 0;
}
2.
#include<iostream>
using namespace std;
int main()
{
int x,y,z;
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
for(z=0;z<=100;z++)
{
if(x+y+z==100&&5*x+3*y+z/3==100&&z%3==0)
{
cout<<"公鸡数="<<x
<<" 母鸡数="<<y
<<" 小鸡数="<<z
<<endl;
};
}
return 0;
}
3.
#include<iostream>
using namespace std;
int main()
{
int x,y,z;
for(x=0;x<=20;x++)
{
z=100-x-y;
if(z>=0&&y>=0&&5*x+3*y+z/3==100&&z%3==0)
{
cout<<"公鸡数="<<x
<<" 母鸡数="<<y
<<" 小鸡数="<<z
<<endl;
};
}
return 0;
}
运行结果截图:
1.
2.
3.
- 调整输入规模(如1000鸡1000钱问题、2000鸡2000钱问题等),观察并记录至少5组(每组多次运行取平均值)不同输入规模下任务1和任务3算法的运行时间,制作excel图表进行对比。
(2)掌握枚举算法的基本思想和实现方法。
任务描述: 如a3= b3 + c3 + d3的等式被称为完美立方等式。例如 123= 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得等式成立,其中a,b,c,d 大于 1, 小于等于N,且 b<=c<=d。
输入:一个正整数N (N≤100)。
输出:每行输出一个完美立方。输出格式为:a^3=b^3+c^3+d^3。 其中a,b,c,d所在位置分别用实际求出四元组值代入。
请按照a的值,从小到大依次输出。当两个完美立方等式中a值相同时,b值小的优先输出,若b仍相同,c值小的优先输出,c再相同时d值小的先输出。
样例输入
24
样例输出
6^3=3^3+4^3+5^3
12^3=6^3+8^3+10^3
18^3=2^3+12^3+16^3
18^3=9^3+12^3+15^3
19^3=3^3+10^3+18^3
20^3=7^3+14^3+17^3
24^3=12^3+16^3+20^3
代码粘贴区:
#include<iostream>
using namespace std;
int main(){
int a,b,c,d;
int N;
cout<<"输入N";
cin>>N;
for(a=2;a<=N;a++){
for(b=2;b<=a;b++)
for(c=b;c<=a;c++)
for(d=c;d<=a;d++){
if(a*a*a==b*b*b+c*c*c+d*d*d)
cout<<a<<"^3="<<b<<"^3+"<<c<<"^3+"<<d<<"^3"<<endl;
}
}
return 0;
}
运行结果截图:
(3)理解完美立方问题和求年龄问题的求解思路。
任务描述:年龄几何:张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是 880,求以他们的年龄为前4项的等差数列的前20项。
思路:先穷举出4个人的年龄在找出等差关系,用for循环求出前20项
实验总结
(1)为什么不使用时间单位来表示时间复杂度。
(2)谈谈你对不同量级时间复杂度的直观认识。
(2)O(1):算法复杂度和问题规模无关。
O(logN):数据量大幅增加时,消耗时间/空间只有少量增加.
O(n):随着样本数量的增加,复杂度也随之线性增加
编程提示
如何记录一段代码的执行时间:
C语言: #include <time.h> int start=clock();int end=clock();int t=end-start;
JAVA:long startTime=System.currentTimeMillis();
long endTime=System.currentTimeMillis();
long Time=endTime-startTime;