算法设计与分析实验报告Word格式文档下载.docx
- 文档编号:17153443
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:36
- 大小:29KB
算法设计与分析实验报告Word格式文档下载.docx
《算法设计与分析实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告Word格式文档下载.docx(36页珍藏版)》请在冰豆网上搜索。
掌握递归算法的设计思想,提高应用分治法设计算法的技能
33
动态规划及其应用
掌握设计动态规划算法的步骤,并编程实现有关算法。
44
贪心算法及其应用
通过本次实验,掌握设计贪心算法的步骤,并编程实现有关问题的求解
545
回溯法及其应用
通过本实验,理解回溯法的深度搜索策略,掌握用回溯法解题的算法框架。
66
分支限界法及其应用
4√√√
通过本实验,理解分支限界法的剪枝搜索策略,掌握用分支限界法算法框架
77
线性规划问题的求解
理解线性规划的算法模型,了解求解线性规划的单纯形算法,学会使用Excel求解线性规划问题。
三、实验内容安排:
实验一算法设计基础
(验证型实验4学时)
1.实验目的
(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求
(1)认真填写实验报告,附加源代码(主要代码)和运行记录;
(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间
和空间复杂度进行分析。
3.实验内容:
(1)统计数字问题(P8)
#include"
iostream"
#include<
stdlib.h>
fstream.h>
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<
<
number[i]<
endl;
fin.close();
fout.close();
return;
}
(2)字典序问题(P8)
(3)最多约数问题(P9)
inta,b,i,j,max;
a>
b;
intnumber[100]={0};
//约数个数
for(i=a;
=b;
for(j=1;
=i;
if(i%j==0)number[i]++;
//若能被整除则约数个数加1
for(i=a;
if(number[i]>
number[i+1])
max=number[i];
elsemax=number[i+1];
max<
(4)最大间隙问题(P10)
(5)设计算法求解fibonacci数列的第110项的值。
(6)设计算法求解尽可能多的完美数(完全数)。
注:
至少选择其中2题完成
实验二递归与分治策略及其应用
(验证型、设计型实验6学时)
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术。
(2)提高应用分治法设计算法的技能
(3)理解这样一个观点:
分治和递归经常同时应用在算法设计中。
(2)对设计好的算法,要分析算法的时间和空间复杂度。
(1)设计算法求解整数的划分问题,对给定的整数,输出划分数。
(P14)并思考
如何实现输出每个具体的划分。
intq(intm,intn)
if((n<
1)||(m<
1))return0;
if((n==1)||(m==1))return1;
if(m<
n)returnq(m,m);
if(m==n)returnq(m,n-1)+1;
returnq(m,n-1)+q(m-n,n);
intn,m;
cout<
"
分别输入m和n的值(m为被划分数,n为最大加数)"
cin>
m>
n;
划分数为:
q(m,n)<
system("
pause"
(2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础
上修改程序,使其能解决有重复元素的排列问题(P41算法实现题2-5)。
intcount=0;
intcheck(charlist[],intk,intm)
//判断是否互异,重复返回0
if(m>
k)
for(inti=k;
i<
m;
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;
=m;
list[i]<
"
;
else//还有多个元素,递归产生排列
for(inti=k;
if(check(list,k,i))
swap(list[k],list[i]);
perm(list,k+1,m);
charnumber[100];
inti=0,n=0;
//n是总个数
number;
//number数组为待排元素
while(number[i]!
='
\0'
)
n++;
i++;
perm(number,0,n-1);
count;
(3)设计算法求解棋盘的覆盖问题,并编程实现(P20)。
(4)设计一个求解Gray码的分治策略,并编程实现(P39算法分析题2-14)。
(5)设计求解半数集问题的算法,并编程实现。
(P40算法实现题2-3)
(6)设计求解整数因子分解问题的算法,并编程实现。
(P43算法实现题2-11)
intnumber,result;
intcount=1;
//输入整数
for(inti=2;
if(number%i==0)
result=number/i;
//result是因子
=result;
if(result%i==0)
(7)设计求解双色hanoi问题的算法,并编程实现。
至少选择其中3题完成
实验三动态规划及其应用
1.目的要求
(1)理解动态规划算法的概念和基本要素,并能和分治法进行比较。
(2)掌握设计动态规划算法的步骤,并编程实现有关算法。
同样的问题可以用不同的方法解决,一个好的算法是反
复努力和重新修正的结果。
(4)对设计好的算法,要分析算法的时间和空间复杂度。
2.实验内容
(1)编程实现矩阵连乘问题的求解。
(P47)
(2)分别采用分治法和动态规划法求解实现最大子段和问题,并编程实现。
(P54)
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;
right;
rights+=a[i];
if(right>
s2)s2=rights;
sum=s1+s2;
if(sum<
leftsum)sum=leftsum;
rightsum)sum=rightsum;
returnsum;
intMaxSumDongtai(intn,int*a)
//最大子段和动态规划法
//n表示前n个数字
intsum=0,b=0;
for(inti=1;
=n;
if(b>
0)
b+=a[i];
b=a[i];
sum)
sum=b;
inta[]={0,1,2,3,4,5,6,7};
intn;
MaxSubSum(a,0,7)<
MaxSumDongtai(7,a)<
(3)编程实现最长公共子序列(LCS)问题的求解。
(P52)
(4)编程实现0-1背包问题的求解。
(P71)
stdio.h>
#definemax(a,b)(((a)>
(b))?
(a):
(b))
//max(a,b)a,b中的最大值
#definemin(a,b)(((a)<
//min(a,b)a,b中的最小值
template<
typenameType>
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];
=c;
{//背包的价值
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);
j++){
m[i][j]=m[i+1][j];
for(j=w[i];
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]);
m[1][c]<
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:
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;
n+1;
ppm[i]=newint[c+1];
Knapsack<
int>
(v,w,c,n,ppm);
TraceBack<
(ppm,w,c,n,x);
for(i=1;
x[i];
(5)设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序
列。
(P87算法分析题3-1)
(6)设计算法求解独立任务最优调度问题,并编程实现。
(P79算法实现题3-1)
(7)设计算法求解石子合并问题编程实现。
(P79实现题3-3)
(8)设计算法求解数字三角形问题,并编程实现。
(P80题3-4)
inta[100][100];
inti,j,n;
printf("
输入行数:
);
scanf("
%d"
&
n);
for(i=1;
i<
=n;
i++)
输入第%d行数:
\n"
i);
for(j=1;
j<
=i;
a[i][j]);
for(i=n-1;
for(j=i;
j>
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]中最大的
最大路径和是:
%d\n"
a[1][1]);
(9)设计算法求解最小m段和问题,并编程实现。
(P81题3-8)
(10)设计算法求解最少费用购物问题,并编程实现。
(P88算法实现题3-14)
至少选择其中3题完成。
3.主要仪器设备及软件
(1)PC机
(2)TC、VC++、Java等任一编程语言
实验四贪心算法及其应用
1.目的要求:
(1)理解贪心算法的概念和基本要素;
(2)掌握设计贪心算法的步骤,并编程实现有关问题的求解。
2.实验内容:
(1)编程实现活动安排问题的求解。
(P91)
voidsort(intf[],intn)
{//结束时间f[]排序
inttemp;
for(intj=0;
i;
if(f[j]>
f[j+1])
{//结束时间按从早到晚排序
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
排序结果:
f[i]<
intgreedySelector(ints[],intf[],boolA[])
{//活动安排算法
intn=s.length-1,j=1,count=1;
A[1]=true;
i++){
if(s[i]>
=f[j])
{//若下一活动开始时间晚于上一活动,则下一活动可安排,活动数
count加1
A[i]=true;
j=i;
elseA[i]=false;
returncount;
(2)设计算法求解会场安排问题,并编程实现。
(P108,算法实现题4-1)。
(3)编程实现最优装载问题的求解。
(P95)
iostream.h"
voidsort(int*w,int*t,intn)
{//按照weight的升序进行排序t[]
i<
intminweight=w[0];
//最小值
for(intj=i;
inttemp=j;
for(intk=i;
k<
=j;
k++)
if(w[k]<
w[temp]){
minweight=w[k];
temp=k;
t[j]=temp;
voidloadling(intx[],intw[],intc,intn)
int*t=newint[n+1];
//指向物品的序号
sort(w,t,n);
x[i]=0;
for(i=1;
=n&
&
w[t[i]]<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)