算法设计与分析实验报告.docx
- 文档编号:10547867
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:39
- 大小:71.68KB
算法设计与分析实验报告.docx
《算法设计与分析实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
算法设计与分析实验报告
四川师范大学计算机学院
实验报告册
院系名称:
计算机科学学院
课程名称:
算法设计与分析
实验学期2015年至2015年第二学期
专业班级:
软件工程
姓名:
沙夫都学号:
2013110431
指导教师:
苏菡
实验最终成绩:
实验报告须知
1.学生填写实验报告应按规范填写,填写格式见由任课老师给出的实验报告样本;
2.学生应填写的内容包括:
封面相关栏目、第一页中‘本学期(年)开设实验课程情况一览表’中的实验名称、学时数;每次报告中的实验性质、同组人姓名、实验日期、以及实验报告中的一至五项;
3.教师填写内容为:
实验评价、每次报告成绩、第一页中‘本学期(年)开设实验课程情况一览表’中成绩、及封面的实验最终成绩;
4.学生实验结束后,教师应对学生实验结果进行核实,学生方可离开实验室。
5、实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。
6.本实验册应妥善保管,本课程实验结束后应交回实验室。
本学期(年)开设实验课程情况一览表
序号
实验名称
(学生实验后填写)
学时数
成绩
(分数或等级)
1
算法设计基础
2
2
递归与分治策略及其应用
3
3
动态规划及其应用
3
4
贪心算法及其应用
2
5
回溯法及其应用
2
6
分支限界法及其应用(选做)
1
7
线性规划问题的求解(选做)
1
实验报告
(1)
实验名称
算法设计基础
同组人姓名
实验性质
□基本操作□验证性
□综合性□设计性
实验日期
实验成绩
教师评价:
实验预习□实验操作□实验结果□实验报告□其它□
教师签名:
一、实验目的及要求
(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
二、实验内容
(1)统计数字问题(P8)
(2)字典序问题(P8)
(3)最多约数问题(P9)
(4)最大间隙问题(P10)
(5)设计算法求解fibonacci数列的第110项的值。
注:
至少选择其中2题完成
三、主要设备及软件
四、实验流程、操作步骤或核心代码、算法片段
(1)统计数字问题(P8)
#include"iostream"
#include
#include
ifstreamfin("input.txt");
ofstreamfout("output.txt");
usingnamespacestd;
inti,n,m;
intpage;//page是书的总页数
intnumber[10]={0};
voidmain()
{
fin>>page;
for(intj=1;j<=page;j++)
{
n=j;
while(n)
{
m=n%10;
++number[m];
n=n/10;
}
}
for(i=0;i<=9;i++)
{
fout< } fin.close(); fout.close(); return; } (3)最多约数问题(P9) #include"iostream" #include #include ifstreamfin("input.txt"); ofstreamfout("output.txt"); usingnamespacestd; voidmain() { inta,b,i,j,max; fin>>a>>b; intnumber[100]={0};//约数个数 for(i=a;i<=b;i++) { for(j=1;j<=i;j++) { if(i%j==0)number[i]++;//若能被整除则约数个数加1 } } for(i=a;i { if(number[i]>number[i+1]) max=number[i]; elsemax=number[i+1]; } fout< fin.close(); fout.close(); } 五、实验结果的分析与评价 实验报告 (2) 实验名称 递归与分治策略及其应用 同组人姓名 实验性质 □基本操作□验证性 □综合性□设计性 实验日期 实验成绩 教师评价: 实验预习□实验操作□实验结果□实验报告□其它□ 教师签名: 一、实验目的及要求 1.实验目的 (1)进一步掌握递归算法的设计思想以及递归程序的调试技术。 (2)提高应用分治法设计算法的技能 (3)理解这样一个观点: 分治和递归经常同时应用在算法设计中。 2.实验要求 (1)认真填写实验报告,附加源代码(主要代码)和运行记录; (2)对设计好的算法,要分析算法的时间和空间复杂度。 二、实验内容 (1)设计算法求解整数的划分问题,对给定的整数,输出划分数。 (P14) (2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P41算法实现题2-5)。 (3)设计算法求解棋盘的覆盖问题,并编程实现(P20)。 (4)设计一个求解Gray码的分治策略,并编程实现(P39算法分析题2-14)。 (5)设计求解半数集问题的算法,并编程实现。 (P40算法实现题2-3) (6)设计求解整数因子分解问题的算法,并编程实现。 (P43算法实现题2-11) (7)设计求解双色hanoi问题的算法,并编程实现。 (P43算法实现题2-11) 注: 至少选择其中3题完成 三、主要设备及软件 四、实验流程、操作步骤或核心代码、算法片段 (1)设计算法求解整数的划分问题,对给定的整数,输出划分数。 (P14)并思考 如何实现输出每个具体的划分。 #include"iostream" #include usingnamespacestd; intq(intm,intn) { if((n<1)||(m<1))return0; if((n==1)||(m==1))return1; if(m if(m==n)returnq(m,n-1)+1; returnq(m,n-1)+q(m-n,n); } voidmain() { intn,m; cout<<"分别输入m和n的值(m为被划分数,n为最大加数)"< cin>>m>>n; cout<<"划分数为: "< cout< system("pause"); } (2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P41算法实现题2-5)。 #include"iostream" #include #include ifstreamfin("input.txt"); ofstreamfout("output.txt"); usingnamespacestd; intcount=0; intcheck(charlist[],intk,intm) //判断是否互异,重复返回0 { if(m>k) for(inti=k;i if(list[i]==list[m]) return0; return1; } inlinevoidswap(char&a,char&b) { chartemp; temp=a;a=b;b=temp; } voidperm(charlist[],intk,intm) {//依次交换第一个元素进行排序 if(k==m)//只剩下一个元素 { count++; for(inti=0;i<=m;i++) fout< fout< } else//还有多个元素,递归产生排列 for(inti=k;i<=m;i++) { if(check(list,k,i)) { swap(list[k],list[i]); perm(list,k+1,m); swap(list[k],list[i]); } } return; } voidmain() { charnumber[100]; inti=0,n=0;//n是总个数 fin>>number;//number数组为待排元素 while(number[i]! ='\0') { n++; i++; } perm(number,0,n-1); fout< fin.close(); fout.close(); system("pause"); } (6)设计求解整数因子分解问题的算法,并编程实现。 (P43算法实现题2-11) #include"iostream" #include #include ifstreamfin("input.txt"); ofstreamfout("output.txt"); usingnamespacestd; voidmain() { intnumber,result; intcount=1; fin>>number;//输入整数 for(inti=2;i { if(number%i==0) { result=number/i;//result是因子 for(inti=2;i<=result;i++) { if(result%i==0) count++; } } } fout< fin.close(); fout.close(); } 五、实验结果的分析与评价 实验报告(3) 实验名称 动态规划及其应用 同组人姓名 实验性质 □基本操作□验证性 □综合性□设计性 实验日期 实验成绩 教师评价: 实验预习□实验操作□实验结果□实验报告□其它□ 教师签名: 一、实验目的及要求 1.目的要求 (1)理解动态规划算法的概念和基本要素,并能和分治法进行比较。 (2)掌握设计动态规划算法的步骤,并编程实现有关算法。 (3)理解这样一个观点: 同样的问题可以用不同的方法解决,一个好的算法是反 复努力和重新修正的结果。 (4)对设计好的算法,要分析算法的时间和空间复杂度。 二、实验内容 (1)编程实现矩阵连乘问题的求解。 (P47) (2)分别采用分治法和动态规划法求解实现最大子段和问题,并编程实现。 (P54) (3)编程实现最长公共子序列(LCS)问题的求解。 (P52) (4)编程实现0-1背包问题的求解。 (P71) (5)设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。 (P87算法分析题3-1) (6)设计算法求解独立任务最优调度问题,并编程实现。 (P79算法实现题3-1) (7)设计算法求解石子合并问题编程实现。 (P79实现题3-3) (8)设计算法求解数字三角形问题,并编程实现。 (P80题3-4) (9)设计算法求解最小m段和问题,并编程实现。 (P81题3-8) (10)设计算法求解最少费用购物问题,并编程实现。 (P88算法实现3-14) 注: 至少选择其中3题完成 三、主要设备及软件 (1)PC机 (2)TC、VC++、Java等任一编程语言 四、实验流程、操作步骤或核心代码、算法片段 (2)分别采用分治法和动态规划法求解实现最大子段和问题,并编程实现。 (P54) #include"iostream" #include usingnamespacestd; intMaxSubSum(int*a,intleft,intright) //最大子段和分治法 { intsum=0; if(left==right) sum=a[left]>0? a[left]: 0; else { intcenter=(left+right)/2; intleftsum=MaxSubSum(a,left,center); intrightsum=MaxSubSum(a,center+1,right); ints1=0; intlefts=0; for(inti=center;i>=left;i--) { lefts+=a[i]; if(lefts>s1)s1=lefts; } ints2=0; intrights=0; for(i=center+1;i { rights+=a[i]; if(right>s2)s2=rights; } sum=s1+s2; if(sum if(sum } returnsum; } intMaxSumDongtai(intn,int*a) //最大子段和动态规划法 //n表示前n个数字 { intsum=0,b=0; for(inti=1;i<=n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } returnsum; } voidmain() { inta[]={0,1,2,3,4,5,6,7}; intn; cout< cout< return; } (4)编程实现0-1背包问题的求解。 (P71) #include #include"iostream" #include usingnamespacestd; #definemax(a,b)(((a)>(b))? (a): (b)) //max(a,b)a,b中的最大值 #definemin(a,b)(((a)<(b))? (a): (b)) //min(a,b)a,b中的最小值 template voidKnapsack(Type*v,int*w,intc,intn,Type**m) { //递归初始条件 //v价值,w重量,c容量,n件数,m价值数 intjMax=min(w[n]-1,c); for(intj=0;j<=jMax;j++) {//背包的重量 m[n][j]=0; } for(j=w[n];j<=c;j++) {//背包的价值 m[n][j]=v[n]; } //m(i,j)背包容量为j,可选择物品为i,i+1…n时0-1背包的最优值 for(inti=n-1;i>1;i--){ jMax=min(w[i]-1,c); for(intj=0;j<=jMax;j++){ m[i][j]=m[i+1][j]; } for(j=w[i];j<=c;j++){ m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } } m[1][c]=m[2][c]; if(c>=w[1]){ m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); cout< } } template voidTraceBack(Type**m,int*w,intc,intn,int*x) {//物品装入x[i]为1,反之为0;背包容量c减少当前装入物品的重量 for(inti=1;i if(m[i][c]==m[i+1][c]) x[i]=0; else{ x[i]=1; c-=w[i]; } } x[n]=(m[n][c])? 1: 0; } voidmain(intargc,char*argv[]) { intn=6,c=20,x[7]; //n个物品,用x[7]来记录每个物品是否装入,c背包容量 intw[7]={-2,5,10,9,5,2,1};//每个物品的重量 intv[7]={-1,6,3,-4,4,6,0};//每个物品的价值 int**ppm=newint*[n+1]; for(inti=0;i ppm[i]=newint[c+1]; } Knapsack TraceBack for(i=1;i<=n;i++){ cout< } return; } (8)设计算法求解数字三角形问题,并编程实现。 (P80题3-4) #include voidmain() { inta[100][100]; inti,j,n; printf("输入行数: "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("输入第%d行数: \n",i); for(j=1;j<=i;j++) scanf("%d",&a[i][j]); } for(i=n-1;i>0;i--) for(j=i;j>0;j--) { a[i][j]+=a[i+1][j+1]>a[i+1][j]? a[i+1][j+1]: a[i+1][j]; //a[i][j]选a[i+1][j+1],a[i+1][j]中最大的 } printf("最大路径和是: %d\n",a[1][1]); return; } 五、实验结果的分析与评价 实验报告(4) 实验名称 贪心算法及其应用 同组人姓名 实验性质 □基本操作□验证性 □综合性□设计性 实验日期 实验成绩 教师评价: 实验预习□实验操作□实验结果□实验报告□其它□ 教师签名: 一、实验目的及要求 1.目的要求: (1)理解贪心算法的概念和基本要素; (2)掌握设计贪心算法的步骤,并编程实现有关问题的求解。 二、实验内容 (1)编程实现活动安排问题的求解。 (P91) (2)设计算法求解会场安排问题,并编程实现。 (P108,算法实现题4-1)。 (3)编程实现最优装载问题的求解。 (P95) (4)编程实现背包问题的求解。 (P94) (5)编程实现多机调度问题的求解。 (P106) (6)设计算法求解汽车加油问题,并编程实现。 (P111,算法实现题4-9); (7)设计算法求解删数问题,并编程实现。 (P112,算法实现题4-11); (8)设计算法求解数列级差问题,并编程实现。 注: 至少选择其中3题完成。 三、主要设备及软件 (1)PC机 (2)TC、VC++、Java等任一编程语言 四、实验流程、操作步骤或核心代码、算法片段 (1)编程实现活动安排问题的求解。 (P91) voidsort(intf[],intn) {//结束时间f[]排序 inttemp; for(inti=1;i { for(intj=0;j if(f[j]>f[j+1]) {//结束时间按从早到晚排序 temp=f[j]; f[j]=f[j+1]; f[j+1]=temp; } } cout<<"排序结果: "< for(inti=0;i cout< } intgreedySelector(ints[],intf[],boolA[]) {//活动安排算法 intn=s.length-1,j=1,count=1; A[1]=true; for(inti=2;i<=n;i++){ if(s[i]>=f[j]) {//若下一活动开始时间晚于上一活动,则下一活动可安排,活动数 count加1 A[i]=true; j=i; count++; } elseA[i]=false; } retur
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 报告