080551张超Word下载.docx
- 文档编号:22848168
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:71
- 大小:78.81KB
080551张超Word下载.docx
《080551张超Word下载.docx》由会员分享,可在线阅读,更多相关《080551张超Word下载.docx(71页珍藏版)》请在冰豆网上搜索。
算法设计基础
4
√
差
通过本次实验,程序设计语言基础知识,熟悉文件操作等
2
递归与分治策略及其应用
6
良
掌握递归算法的设计思想,提高应用分治法设计算法的技能
3
动态规划及其应用
掌握设计动态规划算法的步骤,并编程实现有关算法。
贪心算法及其应用
通过本次实验,掌握设计贪心算法的步骤,并编程实现有关问题的求解
54
5
回溯法及其应用
通过本实验,理解回溯法的深度搜索策略,掌握用回溯法解题的算法框架。
分支限界法及其应用
通过本实验,理解分支限界法的剪枝搜索策略,掌握用分支限界法算法框架
7
线性规划问题的求解
理解线性规划的算法模型,了解求解线性规划的单纯形算法,学会使用Excel求解线性规划问题。
三、实验内容安排:
实验一算法设计基础
(验证型、设计型实验4学时)
1.实验目的
(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求
(1)认真填写实验报告,附加源代码(主要代码)和运行记录;
(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析。
3.实验内容:
(1)统计数字问题(P8)
#include"
stdafx.h"
#include<
iostream>
conio.h>
string>
usingnamespacestd;
voidread_information(string&
Data)
{//从文件中读出停车场信息,并且存放在数组中
cout<
<
"
正在读取数据......"
endl;
FILE*fp;
charch;
if((fp=fopen("
data.txt"
"
rt+"
))==NULL)
{
printf("
\nCannotopenfilestrikeanykeyexit!
);
getch();
exit
(1);
}
ch=fgetc(fp);
while(ch!
=EOF)
Data=Data+ch;
ch=fgetc(fp);
fclose(fp);
读取完成......"
}
voidsave_information(stringdata)
{//把数组中的停车场信息存放回文件中
正在写入文件......"
//定义文件流指针,用于打开写操作的文件
charch[2]="
\0"
;
//定义一个字符串数组,用于存储读取的字符
inti=0;
fp=fopen("
answer.txt"
w"
//写方式打开文件a.txt
while(i<
data.length())//逐行读取fp1所指向文件中的内容到text中
{
ch[0]=data[i++];
fputs(ch,fp);
//将内容写到fp2所指向文件中
}
//关闭文件b.txt
写入完成......"
intmain(intargc,char*argv[])
{
intPage;
intNum[10]={0,0,0,0,0,0,0,0,0,0};
stringData;
intjishu=0;
read_information(Data);
Page=atoi(Data.c_str());
计算中.\n"
jishu<
%"
for(inti=1;
i<
=Page;
i++)
charsz[10];
itoa(i,sz,10);
for(intj=0;
sz[j]!
='
\0'
j++)
{
Num[sz[j]-48]++;
}
if((int)i/Page*100>
jishu)
jishu=i/Page*100;
cout<
stringanswer="
for(i=0;
10;
chartmp[10];
charsz[2];
itoa(Num[i],tmp,10);
answer=answer+sz[0];
answer=answer+"
:
j<
10&
&
tmp[j]!
answer=answer+tmp[j];
answer=answer+'
\n'
save_information(answer);
system("
pause"
return0;
}字典序问题(P8)
(2)最多约数问题(P9)
intyueshuNum(intx)
intnum=0;
=x;
if(x%i==0)
num++;
returnnum;
intstart,end;
intNum=0,flag=1;
stringdata;
read_information(data);
chartmpstart[10];
chartmpend[10];
for(intj=0;
data[j]!
j++)
if(data[j]=='
'
)
flag=j+1;
elseif(flag==1)
tmpstart[j]=data[j];
else
tmpend[j-flag]=data[j];
start=atoi(tmpstart);
end=atoi(tmpend);
for(inti=start;
=end;
intnum=yueshuNum(i);
if(num>
Num)
Num=num;
charanswerchar[10];
itoa(Num,answerchar,10);
for(i=0;
answerchar[i]!
answer=answer+answerchar[i];
(3)最大间隙问题(P10)
(4)设计算法求解fibonacci数列的第110项的值,并统计和分析算法的时间性能。
注:
至少选择其中2题完成
实验二递归与分治策略及其应用
(验证型、设计型实验6学时)
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术。
(2)提高应用分治法设计算法的技能
(3)理解这样一个观点:
分治和递归经常同时应用在算法设计中。
(2)对设计好的算法,要分析算法的时间性能。
(1)设计算法求解整数的划分问题,对给定的整数,输出划分数。
(P14)并思考如何实现输出每个具体的划分。
#include"
iostream"
stdlib.h>
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);
voidmain()
intn,m;
分别输入m和n的值(m为被划分数,n为最大加数)"
cin>
>
m>
n;
划分数为:
q(m,n)<
(2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P41算法实现题2-5)。
(3)设计算法求解棋盘的覆盖问题,并编程实现(P20)。
#include<
iostream.h>
inttile=1;
intboard[100][100];
voidchessBoard(inttr,inttc,intdr,intdc,intsize)
{
if(size==1)
return;
intt=tile++;
ints=size/2;
if(dr<
tr+s&
dc<
tc+s)
chessBoard(tr,tc,dr,dc,s);
else
board[tr+s-1][tc+s-1]=t;
chessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
dc>
=tc+s)
chessBoard(tr,tc+s,dr,dc,s);
board[tr+s-1][tc+s]=t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s);
if(dr>
=tr+s&
chessBoard(tr+s,tc,dr,dc,s);
board[tr+s][tc+s-1]=t;
chessBoard(tr+s,tc,tr+s,tc+s-1,s);
chessBoard(tr+s,tc+s,dr,dc,s);
board[tr+s][tc+s]=t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);
}}
voidmain()
intsize;
cout<
输入棋盘的size(大小必须是2的n次幂):
"
cin>
size;
intindex_x,index_y;
输入特殊方格位置的坐标:
index_x>
index_y;
chessBoard(0,0,index_x,index_y,size);
for(inti=0;
i<
i++)
j<
j++)
board[i][j]<
\t"
(4)设计一个求解Gray码的分治策略,并编程实现(P39算法分析题2-14)。
(5)设计求解半数集问题的算法,并编程实现。
(P40算法实现题2-3)
fstream.h>
ifstreamfin("
input.txt"
ofstreamfout("
output.txt"
voidset(intnum,int&
count)
//递归函数
for(inti=1;
i<
=num;
i++)
count+=1;
set(i/2,count);
intcount=1;
intNum;
//文件操作
fin>
Num;
//重新设置count的值
set(Num/2,count);
//调用递归函数进行计算
fout<
count<
\n"
//向文件中写入数据
fout.close();
//关闭文件
fin.close();
(6)设计求解整数因子分解问题的算法,并编程实现。
(P43算法实现题2-11)
intnumber,result;
intcount=1;
fin>
number;
//输入整数
for(inti=2;
i++)
if(number%i==0)
result=number/i;
//因子
for(inti=2;
=result;
{
if(result%i==0)
count++;
}
fout<
count;
fin.close();
fout.close();
(7)设计求解双色hanoi问题的算法,并编程实现。
至少选择其中4题完成
实验三动态规划及其应用
1.目的要求
(1)理解动态规划算法的概念和基本要素,并能和分治法进行比较。
(2)掌握设计动态规划算法的步骤,并编程实现有关算法。
同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
2.实验内容
(1)编程实现矩阵连乘问题的求解。
constintMAX=100;
//p用来记录矩阵的行列,main函数中有说明
//m[i][j]用来记录第i个矩阵至第j个矩阵的最优解
//s[][]用来记录从哪里断开的才可得到该最优解
intp[MAX+1],m[MAX][MAX],s[MAX][MAX];
intn;
//矩阵个数
intmatrixChain()
for(inti=0;
=n;
m[i][i]=0;
for(intr=2;
r<
r++)//对角线循环
=n-r;
i++)//行循环
intj=r+i-1;
//列的控制
//找m[i][j]的最小值,先初始化一下,令k=i
m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j+1];
s[i][j]=i;
//k从i+1到j-1循环找m[i][j]的最小值
for(intk=i+1;
k<
j;
k++){
inttemp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(temp<
m[i][j])
m[i][j]=temp;
//s[][]用来记录在子序列i-j段中,在k位置处
//断开能得到最优解
s[i][j]=k;
returnm[0][n-1];
//根据s[][]记录的各个子段的最优解,将其输出
voidtraceback(inti,intj)
if(i==j)
'
A'
i;
return;
if(i<
s[i][j])
('
traceback(i,s[i][j]);
)'
if(s[i][j]+1<
j)
traceback(s[i][j]+1,j);
voidtraceback(){
traceback(0,n-1);
intmain()
请输入矩阵的个数:
输入矩阵(形如a*b,中间用空格隔开):
p[i];
//测试数据可以设为六个矩阵分别为
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]
//则p[0-6]={30,35,15,5,10,20,25}
输出结果如下:
matrixChain();
//最终解值为m[0][n-1];
return0;
(2)编程实现最大子段和问题的求解(分别采用分治法和动态规划法求解)。
#include"
//分治法
intmaxsubsum(int*a,intleft,intright)
intsum=0;
if(left==right)sum=a[left]>
0?
a[left]:
0;
intcenter=(left+right)/2;
intleftsum=maxsubsum(a,left,center);
intright
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 080551
![提示](https://static.bdocx.com/images/bang_tan.gif)