当前位置:文档之家› 算法程序设计实验报告

算法程序设计实验报告

算法程序设计实验报告
算法程序设计实验报告

《程序设计》课程设计

姓名:王

学号:20100034

班级:软件工程00班

指导教师:王会青

成绩:

2010年6月

实验一.构造可以使n个城市连接的最小生成树专业:__软件工程___ 班级:__软件姓名:_王___ 学号:_20100034

完成日期:_2010/6/26________

一、【问题描述】

给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。

1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。

2 显示出城市间道路网的邻接矩阵。

3 最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。

4 输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal 算法→执行 Prim 算法→输出最小生成树

二、【问题分析】

1.抽象数据类型结构体数组的定义:

#ifnd ef ADJACENCYMATRIXED //防止该头文件被重复引用

#define ADJACENCYMATRIXED //而引起的数据重复定义

#define INFINITY 32767 //最大值∞

#define MAX_VERTEX_NUM 20 //最大顶点个数

typedef int VRType; //权值,即边的值

typedef char InfoType; //附加信息的类型,后面使用时会定义成一个指针

typedef char VertexType[MAX_VERTEX_NUM]; //顶点类型

typedef enum {DG=1, DN, UDG, UDN} GraphKind; //{有向图,有向网,无向图,无向网}

typedef struct ArcCell

{

VRType adj; //VRType 是顶点关系类型。对无权图,用1 或0 表示相邻否;对带权图,则为权值类型。

InfoType*info; //该弧关系信息的指针

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; //顶点向量

AdjMatrixarcs; //邻接矩阵

int vexnum, arcnum; //图的当前顶点数和弧数

GraphKind kind; //图的种类标志

}MGraph;

typedef struct //普里姆算法辅助数组的定义

{

VertexType adjvex;

VRType lowcost;

}closedge[MAX_VERTEX_NUM];

#endif //结束if

2 程序模块

MGraph G; //网G,唯一的全局变量

int main(int argc, char * argv[]); //主函数

Status LocateVex(MGraph G, VertexType v); //判断城市v 在网G 中的位置Status CreateUDN(MGraph &G); //创建网G 的邻接矩阵

void DisplayNet(MGraph G); //以邻接矩阵的形式显示网G void MiniSpanTree_KRUSKAL(MGraph G); //最小生成树的Kruskal 算法

void MiniSpanTree_PRIM(MGraph G, VertexType u); //最小生成树的Prim 算法Status Minimum(closedge closeEdge, int n); //Prim 算法中求下一个城市的函数void DeleteInfo(MGraph &G); //释放堆内存上动态申请的空间

3.流程图

4.数据类型定义

为了用邻接矩阵表示图G ,先是定义二维数组的每一个元素含道路值然后在图的定义中定义一个此二维数组的结构成员。并且在图中还定义一个用来存放城市的一维数组及int 型的城市数级道路数。

用二维数组的两个下标表示道路,这两个下标又在一位数组中对应两个城市。

这样就建立起了一个城市到城市之间的道路网。

4. 程序主要模块

说明:该程序共含5个模块,本人负责其中2个模块构造:

***************LocateVex(MGraph G, VertexType v)**************** Status LocateVex(MGraph G, VertexType v);

{

while (strcmp(G.vexs[i], v)) {i++;}

返回i;

}

**************** CreateUDN*************************

{

输入城市数、道路数;

for (i=0; i<城市数; ++i) 输入城市名;

for (i=0; i<城市数; ++i)

for(j=0; j<城市数; ++j)

初始化邻接矩阵:道路值= INFINITY;

for (i=0; i<城市数; ++i)

for(j=0; j<城市数; ++j)

输入两个城市表示道路,输入道路值;

}

PRIM算法

************************** MiniSpanTree_PRIM*********

void MiniSpanTree_PRIM(MGraph G, VertexType u)

{

定义辅助数组:closedge closeEdge;

初始化:strcpy(closeEdge[j].adjvex, u);

closeEdge[j].lowcost = G.arcs[k][j].adj;

for (i=1; i

{

在其余G.vexnum-1个城市中找到离辅助数组中标记的道路最小值;

显示找到的道路;

标记新找到的城市;

}

}

********************** Minimum*****************

Status Minimum(closedge closeEdge, int n)

{

在辅助数组中找到道路值最小的道路的两点城市:

if ((closeEdge[i].lowcost != 0) && (minTemp > closeEdge[i].lowcost))

返回该城市在G 中的位置

}

三、【功能实现】

#include

#include

#include

#include

#include "TypeDefine.h"

#include "AdjacencyMatrix.h"

#include "InitializeFunction.h"

#include "MiniSpanTree_KRUSKAL.h"

#include "MiniSpanTree_PRIM.h"

#include "DisplayNet.h"

#include "DeleteInfo.h"

MGraph G; //全局变量G

int main(int argc, char * argv[]);//主函数

Status LocateVex(MGraph G, VertexType v);//判断城市v 在网G 中的位置Status CreateUDN(MGraph &G);//创建网G 的邻接矩阵

void DisplayNet(MGraph G);//以邻接矩阵的形式显示网G

void MiniSpanTree_KRUSKAL(MGraph G);//最小生成树的Kruskal 算法

void MiniSpanTree_PRIM(MGraph G, VertexType u);//最小生成树的Prim 算法Status Minimum(closedge closeEdge, int n);//Prim 算法中求下一个城市的函数void DeleteInfo(MGraph &G);//释放堆内存上动态申请的空间

int main(int argc, char * argv[])

{

CreateGraph(G);

DisplayNet(G);

MiniSpanTree_KRUSKAL(G);

MiniSpanTree_PRIM(G, G.vexs[0]);

DeleteInfo(G);

cout<

system("pause");

return 0;

}

//intializeFunction.h

Status CreateDG(MGraph &G){return 0;};

Status CreateDN(MGraph &G){return 0;};

Status CreateUDG(MGraph &G){return 0;};

Status CreateUDN(MGraph &G);

Status LocateVex(MGraph G, VertexType v)

{

//判断输入的顶点v在G中的位置。

//根据顶点的类型,可重载此函数。目前为char

int i=0;

while (strcmp(G.vexs[i], v)) {i++;}

return i;

}

Status CreateGraph(MGraph &G)

{

//采用数组(邻接矩阵)表示法,构造图G.

G.kind = UDN; //默认构造无向网

/* printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

printf("|1:有向图2:无向图3:有向网4:无向网\n");

printf("|请选择:[ ]\b\b");

scanf("%d", &G.kind);

printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");*/

switch (G.kind)

{

case DG: return CreateDG(G); //构造有向图G

case DN: return CreateDN(G); //构造有向网G

case UDG: return CreateUDG(G); //构造无向图G

case UDN: return CreateUDN(G); //构造无向网G

default : return ERROR;

}

}//CreateGraph

Status CreateUDN(MGraph &G)

{

//采用数组(邻接矩阵)表示法,构造图G.

int i, j, k;

VertexType v1, v2;

VRType w;

printf(" 构造可以使N个城市连接的最小生成树\n");

printf("请输入城市数、道路数(至少6个城市,10条道路):");

cin>>G.vexnum>>G.arcnum;

for (i=0; i

{

printf("请输入第%d 个城市名(共%d 个):", i+1, G.vexnum);

cin>>G.vexs[i];

}

for (i=0; i

{

for (j=0; j

{

G.arcs[i][j].adj = INFINITY;

// G.arcs[i][j].info = NULL;

}

}

printf("请输入一条道路连接的两个城市名及权值:\n");

for (k=0; k

{

printf("共%3d条道路,第%3d条道路:", G.arcnum,k+1);

cin>>v1>>v2>>w; //输入一条边依附的顶点及权值

i = LocateVex(G, v1); //确定v1、v2在G中的位置

j = LocateVex(G, v2);

G.arcs[i][j].adj = w; //弧的权值

G.arcs[j][i] = G.arcs[i][j]; //置的对称弧

}

return OK;

}//CreateUDN

//MiniSpan Tree PRIM.h

Status Minimum(closedge closeEdge, int n)

{

int i, flag, minTemp = INFINITY;

for (i=0; i

{

if ((closeEdge[i].lowcost != 0) && (minTemp > closeEdge[i].lowcost))

{

minTemp = closeEdge[i].lowcost;

flag = i;

}

}

return flag;

}

void MiniSpanTree_PRIM(MGraph G, VertexType u)

{

//用普里姆算法从第u 个顶点出发构造网G 的最小生成树T,输出T 的各条边。

//记录从顶点集U 到V-U 的代价最小的边的辅助数组定义见"AdjacencyMatrix.h"

int i, j, k, totalCost=0;

closedge closeEdge;

k = LocateVex(G, u);

for (j=0; j

{

if (j != k)

{

strcpy(closeEdge[j].adjvex, u);

closeEdge[j].lowcost = G.arcs[k][j].adj;

}

}

cout<<"\n\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\\n";

cout<<"|用Prim算法求最小生成树的各条边依次为:\n-----";

closeEdge[k].lowcost = 0; //初始,U={u};

for (i=1; i

{

k = Minimum(closeEdge, G.vexnum); //求出T 的下一个结点:第k 顶点

//此时closeEdge[k].lowcost = MIN{closeEdge[vi].lowcost | closeEdge[vi].lowcost > 0, vi∈V-U} cout<<'<'<'; //输出生成树的边

totalCost += closeEdge[k].lowcost;

closeEdge[k].lowcost = 0; //第k 顶点并入U 集

for (j=0; j

{

if (G.arcs[k][j].adj < closeEdge[j].lowcost) //新顶点并入U 后重新选择最小边

{

strcpy(closeEdge[j].adjvex, G.vexs[k]);

closeEdge[j].lowcost = G.arcs[k][j].adj;

}

}

}

cout<<"\n|总代价:"<

cout<<"+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/\n";

}//MiniSpanTree

四、【实例测试及运行结果】

五、【心得体会】

通过本周的课程设计,我有不少收获。既巩固和加深了对数据结构的理解,认识到《数据结构》是计算机专业一门重要的专业技术基础课程,还提高了我综合运用本课程所学知识的能力。而且,并不是单纯的看看教材就能解决我们的实际问题,所以还要去查找各种我们所需要的资料,

所以这次课程设计也培养了我选用参考书,查阅手册及文献资料的能力。要完成一个课程设计的课题并不是一次就能编译成功的,中间会出现很多的大问题小问题,改错是个很繁琐的问题。通过这次课程设计培养了我独立思考,深入研究,分析问题,解决问题的能力。

在以后的学习过程中我将要注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。

实验二:统计数字

专业:__软件工程___ 班级:__软件_ 姓名:_王____ 学号:_20100034

完成日期:_2010/6/28_______

1.【问题描述】

某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

2【设计需求及分析】

(1)设计要求

原始数据保存在文件count.in中,文件包含n+1行。第1行是整数n(1<=n<=200000),表示自然数的个数;第2~n+1行每行一个自然数。

结果保存在文件count的尾部,其中结果包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

(2)设计思路

首先必须有文件的打开和关闭语句,将文件的内容读取到数组a[]中,然后对数组进行排列和对比,计数。最终输出数据和次数。并写入文件的尾部。

A[]为容纳数据的数组,fopen为文件打开函数,fscanf为文件读取函数,然后进行冒泡排序。排序之后的内容由while设置条件,用if进行判断。在不等于时,中间嵌套了一个while循环,进行往后的排查。最后输出数据和次数。

下面是关键步骤:

FILE* fp=fopen("count.txt","a+"); //用只读/的方式打开文件

if(fp==NULL) {

printf("无文件"); //若没有文件则返回—1

return -1; }

for(i=0;i<9;i++) {

fscanf(fp,"%d",&a[i]); //读取文件

fscanf(fp,"\n"); }

int j,t;

for (i=1;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j]>a[j+1]){ //冒泡排序

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

for(i=0;i<9;i++) {

count=1;

if (a[i]!=a[i+1]) {

printf("%d\t%d\n",a[i],count);

i++;

} 对数字的循环查找和控制条件,if(a[i] == a[i + 1])

{

while(a[i] == a[i + 1])

{

count++;

i++; }

}

}

(3)输出输入格式

输入时,为竖行依此输入文件,且为数字。且为9个以内的数字。输出时,分为两行,第一列为数据,第二列为次数。 3. 【设计功能的实现】

#include int main() {

int a[100]; //创建容纳文件数据的数组int i;

FILE* fp=fopen("count.txt","a+"); //用只读/的方式打开文件if(fp==NULL) {

printf("无文件"); //若没有文件则返回—1 return -1; } for(i=0;i<9;i++) {

fscanf(fp,"%d",&a[i]); //读取文件fscanf(fp,"\n"); }

int j,t;

for (i=1;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j]>a[j+1])

{ //冒泡排序

t=a[j];

a[j]=a[j+1];

a[j+1]=t; }

printf("结果为:\n数据结果\n"); int count;

for(i=0;i<9;i++) {

count=1;

if(a[i]!=a[i+1]) {

printf("%d\t%d\n",a[i],count);

printf(fp,"%d\t%d\n",a[i],a[i]);

i++;

}

if(a[i] == a[i + 1])

{

while(a[i] == a[i + 1])

{

count++;

i++;

}

printf("%d\t%d\n", a[i], count);

}

}

fclose(fp); //关闭文件

return 0;

}

4.【实例测试及运行结果】

5.【心得体会】

本次实验使我对于文件的打开和关闭语句有了更深的理解。有打开必须有关闭。同时在这次的设计中,我学习到了用泛洪算法解决实际问题的基本思维和步骤。使我对算法的层次性更加清楚,更加加深了对算法的理解。

实验三.送货

专业:__软件工程___ 班级:__软件姓名:_王_ 学号:_20100034

完成日期:_2010/6/26________

1.【问题描述】

小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。

输入数据格式

输入的第一行包含两个整数n, m(1≤n≤10, n-1≤m≤20),表示交叉路口的数量和街道的数量,交叉路口从1到n标号。

接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。

输出输出格式

如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数p1, p2, p3, ..., p m+1,表示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。如果有多种方案满足条件,则输出字典序最小的一种方案,即首先保证p1最小,p1最小的前提下再保证p2最小,依此类推。

如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。

测试数据一

输入:输出:

4 5

1 2 4 1 3 4

1 2

1 3

1 4

2 4

3 4

输出说明:城市的地图和小明的路径如下图所示。

测试数据二

输入:输出:

4 6

1 2

1 3

1 4

2 4

3 4

2 3

-1

2【问题分析】

该算法使用欧拉回路,对于欧拉图,从一个节点出发,从某个节点开始,然后查出一个从这个出发回到这个点的环路径。这种方法不保证每个边都被遍历。如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。这样直至所有的边都被遍历。这样,整个图就被连接到一起了。

具体步骤:

1。如果此时与该点无相连的点,那么就加入路径中

2。如果该点有相连的点,那么就加入队列之中,遍历这些点,直到没有相连的点。

3。处理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。

4。这个其实是个递归过程。

3【功能实现】

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=10005;

stack st;

vector vec[maxn];

bool map[maxn][maxn];

int vis[maxn];

int cp[maxn];

int n,m;

void pd(int a)

{

cp[a]=1;

vector::iterator it;

for(it=vec[a].begin();it!=vec[a].end();it++) {

if(!cp[*it])

pd(*it);

}

}

void dfs(int a)

{

vector::iterator it;

for(it=vec[a].begin();it!=vec[a].end();it++) {

if(!map[a][*it])

{

map[a][*it]=1;

map[*it][a]=1;

dfs(*it);

st.push(*it);

}

}

}

void prt()

{

st.push(1);

while(!st.empty())

{

//printf("%d ",st.top());

int ss=st.top();

st.pop();

printf("%d ",ss);

}

}

int main()

{

int num=0;

//memset(cp,0,sizeof(cp));

//memset(vis,0,sizeof(vis));

//memset(map,0,sizeof(map));

for(int i=0;i

{

cp[i]=vis[i]=0;

}

scanf("%d %d",&n,&m);

int a,b;

for(int i=0;i

{

scanf("%d %d",&a,&b);

vec[a].push_back(b);

vec[b].push_back(a);

vis[a]++;

vis[b]++;

}

int flag=0;

pd(1);

for(int i=1;i<=n;++i)

{

if(cp[i]==0)

flag=1;

else

break;

}

if(flag)

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

现代设计黄金分割法复合形法实验报告word文档良心出品

《现代设计理论与方法》实验报告 、实验目的 机械优化设计是一门实践性较强的课程,学生通过实际上机计算可以达到以 下目的: 1. 加深对机械优化设计方法的基本理论和算法步骤的理解; 2. 培养学生独立编制或调试计算机程序的能力; 3. 掌握常用优化方法程序的使用方法; 4 .培养学生灵活运用优化设计方法解决工程实际问题的能力。 、实验项目、学时分配及对每个实验项目的要求 1.明确黄金分割法基本原理、计算步骤及程序框图; 吐 入「土 2?编制或调试黄金分割法应用程序; 1 黄金分割法 2 八' " 3 ?用测试题对所编程序进行测试; 4?撰写实验报告。 1.明确复合形法基本原理、计算步骤及程序框图 等; 2 复合形法 4 2?编制或调试复合形法应用程序; 3 ?用测试题对所编程序进行测试; 4?撰写实验报告。 二、测试题 1. 黄金分割法程序测试题 1 )rn"何二?-10r+36,取坷=0 ,卜皿1, 沪 程序如下: #in clude #in clude #in clude #defi ne e 0.00001 序实验项目 学时 号 实验要求

#define tt 0.01 float function(float x) float y=pow(x,2)-10*x+36;// return(y); void finding(float a[3],float f[3]) float t=tt,a1,f1,ia; int i; f[0]=function(a[0]); for(i=0;;i++) a[1]=a[0]+t;f[1]=function(a[1]); if(f[1]=e) t=-t;a[0]=a[1];f[0]=f[1]; else{ if(ia==1) return; t=t/2;ia=1; for(i=0;;i++) a[2]=a[1]+t;f[2]=function(a[2]); if(f[2]>f[1]) break; t=2*t; a[0]=0;/ / 初始区间的下界值 求解的一维函数

北京理工大学《数据结构与算法设计》实验报告实验一

《数据结构与算法设计》 实验报告 ——实验一 学院: 班级: 学号: 姓名:

一、实验目的 1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC环境,加强编程、调试的练习; 3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作; 4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的 结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到 第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点 的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出 了这个环表的全部结点为止。 三、程序设计 1、概要设计 为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。 (1)、单向环表的抽象数据类型定义为: ADT Joseph{ 数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={ |ai∈D,i=1,2,……,n} 基本操作: create(&L,n) 操作结果:构造一个有n个结点的单向环表L。 show(L) 初始条件:单向环表L已存在。 操作结果:按顺序在屏幕上输出L的数据元素。 Josephf( L,m,s,n) 初始条件:单向环表L已存在, s>0,n>0,s

机电产品设计实验报告

课程名称:机电产品现代设计方法上课时间:2015年春季 机电产品现代设计方法实验报告 姓名: 学号: 班级: 所在学院:机电工程学院 任课教师:张旭堂

一、实验项目与实验目的 实验项目: 典型机电产品多学科协同优化设计。 试验目的: (1) 掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台。 (2)自主设计产品模型、分析过程、优化目标。 (3) 对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 二、实验环境 网络协同设计环境,如下图所示:包括产品CAD建模、有限元分析FEM、动力学仿真ADAMS和控制仿真MATLAB。计算机网络硬件环境和相应软件环境。图形工作站和路由器,安装协同设计仿真软件。

型 协同设计仿真平台组成 三、实验原理 典型机电产品协同设计仿真工作流程如下图所示。 1)利用CAD建模工具,建立产品模型; 2)利用ADAMS建立产品运动学模型; 3)根据CAD和ADAMS传过来的结构模型和边界条件分析零件应力场和应变场; 4)用ADAMS分析得到的运动参数(位移、速度)。

协同设计仿真平台组成 四、实验内容与步骤 (1)总体方案设计 SysML语言是UML语言(Unified Modeling Language,统一建模语言,一种面向对象的标准建模语言,用于软件系统的可视化建模)在系统工程应用领域的延续和扩展,是近年提出的用于系统体系结构设计的多用途建模语言,用于对由软硬件、数据和人综合而成的复杂系统的集成体系结构进行可视化的说明、分析、设计及校验。 在这里我们绘制参数图如下。在下面的参数图中,我们确定了系统中各部件的相互约束情况。

算法设计实验报告一(简单算法设计)

实验报告一 课程C++ 实验名称简单算法设计第 1 页专业_数学与应用数学_ __ 班级__ 双师一班学号105012011056 姓名陈萌 实验日期:2013 年 3 月9 日报告退发(订正、重做) 一、实验目的 1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程; 2. 掌握简单问题的算法设计与分析,能设计比较高效的算法; 3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力。 二、实验内容 (一)相等元素问题 1.问题描述 元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少? 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1767题 输入:输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出一行,若该组测试例中存在两个相等的元素则输出”Yes”,否则,输出”No”。每个测试例的输出数据用一行表示。 3. 测试数据 输入:3 10 9 71 25 64 38 52 5 31 19 45 16 26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33 20 15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91 输出:No Yes No (二) 整数集合分解 1.问题描述 设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1768题 输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n为偶数,且n<=500),表示原整数集合的长度,第二行给出这n个整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出两行,分别表示新生成的整数集合。其中,第一行是元素和比较小的整数集合,第二行是元素和比较大的整数集合,整数之间用一个空格隔开。两个测

算法设计与分析实验报告

本科实验报告 课程名称:算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真 指导教师:郝晓丽

2018年05月04 日 实验一递归与分治算法 1.1 实验目的与要求 1.进一步熟悉C/C++语言的集成开发环境; 2.通过本实验加深对递归与分治策略的理解和运用。 1.2 实验课时 2学时 1.3 实验原理 分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。 需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。 1.4 实验题目 1.上机题目:格雷码构造问题 Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。 对于给定的正整数n,格雷码为满足如下条件的一个编码序列。 (1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2)序列中无相同的编码。 (3)序列中位置相邻的两个编码恰有一位不同。 2.设计思想:

根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011 010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网1101 姓名:黄振亮 学号:20113379 2013年11月

目录 作业1 0-1背包问题的动态规划算法 (7) 1.1算法应用背景 (3) 1.2算法原理 (3) 1.3算法描述 (4) 1.4程序实现及程序截图 (4) 1.4.1程序源码 (4) 1.4.2程序截图 (5) 1.5学习或程序调试心得 (6) 作业2 0-1背包问题的回溯算法 (7) 2.1算法应用背景 (3) 2.2算法原理 (3) 2.3算法描述 (4) 2.4程序实现及程序截图 (4) 2.4.1程序源码 (4) 2.4.2程序截图 (5) 2.5学习或程序调试心得 (6) 作业3循环赛日程表的分治算法 (7) 3.1算法应用背景 (3) 3.2算法原理 (3) 3.3算法描述 (4) 3.4程序实现及程序截图 (4)

3.4.1程序源码 (4) 3.4.2程序截图 (5) 3.5学习或程序调试心得 (6) 作业4活动安排的贪心算法 (7) 4.1算法应用背景 (3) 4.2算法原理 (3) 4.3算法描述 (4) 4.4程序实现及程序截图 (4) 4.4.1程序源码 (4) 4.4.2程序截图 (5) 4.5学习或程序调试心得 (6)

作业1 0-1背包问题的动态规划算法 1.1算法应用背景 从计算复杂性来看,背包问题是一个NP难解问题。半个世纪以来,该问题一直是算法与复杂性研究的热点之一。另外,背包问题在信息加密、预算控制、项目选择、材料切割、货物装载、网络信息安全等应用中具有重要的价值。如果能够解决这个问题那么则具有很高的经济价值和决策价值,在上述领域可以获得最大的价值。本文从动态规划角度给出一种解决背包问题的算法。 1.2算法原理 1.2.1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi ∈{0,1}, ?∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 1.2.2、最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有 ∑vizi > ∑viyi (i=2,…,n) 且 w1y1+ ∑wizi<= c 因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n) 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。 1.2.3、递推关系:

机电产品现代设计方法实验报告

课程名称:机电产品现代设计方法 上课时间:2014年春季 机电产品现代设计方法实验报告 姓名: 学号: 班级: 所在学院:机电工程学院 任课教师:金天国张旭堂

实验名称机电产品现代设计方法 姓名学号班级 实验地点实验日期评分 指导教师张旭堂同组成员其他 1 静态存储器扩展实验 1.1 实验目的 (1)掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台; (2)自主设计产品模型、分析过程、优化目标; (3)对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 1.2 实验内容 (1) 轴的有限元分析 (2) 基于Adams的运动学分析与仿真 1.3实验相关情况介绍(包含使用软件或实验设备等情况) 1.3.1使用软件 本实验使用软件为Adams及abaqus,利用Adams进行运动学仿真分析,利用abaqus进行有限元分析。 1.3.2实验设备 计算机。 1.4实验结果 1.4.1基于ADAMS 的运动学仿真 (1)构造ADAMS样机机械模型 根据指导书建立铲车的三维模型。三维模型可以通过专门三维建模软件进行建模,然后导入ADAMS,也可以直接用ADAMS建模。利用ADAMS建模过程在《adams 运动仿真例子》中有详述,直接给出建模后的模型,如图1所示:

图1 铲车模型 (2)构建约束 根据要求构造四个约束:基座和座架之间的创建转动副,轴肩与座架间构建转动副,铲斗与悬臂间构建转动副,悬臂与轴肩之间构建平动副。构建后的模型如图2所示: 图2 添加约束铲车模型 (3)添加运动 根据题意分别对四个运动副添加运动函数: (a)基座和座架之间的创建转动副:360d*time;

算法设计实验报告

《算法设计》实习报告 班级 XXXX 名 XX 学号 XXXXXXX 1.给出Dijkstra算法的思想,并用C或C++实现,并分析该算法的复杂度。对下 图所示的有向网,试利用Dijkstra算法求出从源点1到其他顶点的最短路径。 实习报告的内容: <一>解决问题和算法思想 这个问题即为单源最短路问题。解决单源最短路径的基本思想是把图中所有结点分为两组,每一个结点对应一个距离值。设置两个结点的集合S和T,集合S中存放已找到最短路径的结点,集合T存放当前还未找到最短路径的结点。初始状态时,集合S只包含源点,设为V0,然后不断从集合T中选择到源点V0路径长度最短的结点u加入到集合S中,集合S每加入一个新的结点u都要修改从源点V0到集合T中剩余结点的当前最短路径长度值,集合T中各结点的新的当前路径最短路径,为原来的最短路径与从源点过结点u到达该结点的路径长度中的较小者。此过程不断重复,直到集合T中的结点全部加入到集合S中为止。 <二>调试通过的源程序 (1)顺序表打包文件:seqlist.h typedef struct { datatype list[maxsize]; int size; }seqlist; void listinitiate(seqlist *l) { l->size=0; } int listlength(seqlist l) { return l.size; } int listinsert(seqlist *l,int i,datatype x) { int j; if(l->size>=maxsize)

{ printf("it is too full!\n"); return 0; } else if(i<0||i>l->size) { printf("error!\n"); return 0; } else { for(j=l->size;j>i;j--) l->list[j]=l->list[j-1]; l->list[i]=x; l->size++; return 1; } } int listdelete(seqlist *l,int i,datatype *x) { int j; if(l->size<=0) { printf("it is empty!\n"); return 0; } else if(i<0||i>l->size-1) { printf("error!\n"); return 0; } else { *x=l->list[i]; for(j=i+1;j<=l->size-1;j++) l->list[j-1]=l->list[j]; l->size--; return 1; } } int listget(seqlist l,int i,datatype *x) { if(i<0||i>=l.size-1) { printf("error!\n"); return 0; } else { *x=l.list[i]; return 1; } } (2)邻接矩阵打包文件:adjmgraph.h

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

现代设计方法实验报告

《现代机械设计方法学》实验报告 班级: 学号: 姓名: 成绩:

实验一、有限元分析 (一)目的: 1、初步掌握有限元软件分析力学问题的过程,包括几何建模、网格划分等前处理功能,掌握各种计算结果的阅读。 2、掌握材料数据、载荷、约束的添加方法。 (二)要求:学生独立完成一个算例的有限元分析,并阅读其计算结果,提交一个算例的分析报告。 (三)计算实例 1、问题的描述 为了考察铆钉在冲压时,发生多大的变形,对铆钉进行分析。 铆钉圆柱高:10mm 铆钉圆柱外径:6mm 铆钉下端球径:15mm 弹性模量:2.06E11 泊松比:0.3 铆钉材料的应力应变关系如下: 应变0.003 0.005 0.007 0.009 0.011 0.02 0.2 618 1128 1317 1466 1510 1600 1610 应力 /Mpa

1、有限元模型。

3、应力云图,可选主应力或σx、σy、τxy、V on Mises应力、Tresca应力之一输出结果图片,指明你所选的应力的最大值及其位置。 (三)思考题: 1、如果要提高边界处计算精度,一般应如何处理? 答:在边界处划分网格 2、有限元网格划分时应注意哪些问题? 答:选取的时候要将编号显示出来,这样就可以更好的选择,网格尽可能的小,这样结果就越准确。

实验二、优化实验 (一)目的: 初步掌握利用ANSYS软件或MATLAB软件对问题进行分析。 (二)要求: 学生独立完成一个算例的分析,并给出算例的计算结果。。 (三)算例 1.实际问题 梁的形状优化,优化目的是使梁的体积最小,同时要求梁上的最大应力不 超过30000psi,梁的最大挠度不大于0.5in,沿长度方向梁的厚度可以变化,但梁端头的厚度为定值t,采用对称建模。 使用两种方法进行优化,两种方法优化结果。 子问题近视法目标ANSYS 百分比(TVOL)体积in3 3.60 3.62 1.004 (DEFL)挠度max in 0.500 0.499 0.998 (STRS)应力max,psi 30000 29740 0.991 第一阶法目标ANSYS 百分比(TVOL)体积in3 3.6 3.61 1.003 (DEFL)挠度max in 0.5 0.5 1.001 STRS)应力max,psi 30000 29768 0.992

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

物体运动的方式实验报告

物体运动的方式实验报告 (文章一):实验报告四年级4课.小吊车活动1:做小吊车(分组实验)制作目的:做小吊车并研究小吊车原理制作材料及工具:小纸盒吊车臂吊臂支架线绳两个铁丝钩一个剪刀锥子胶水钩码制作过程: 1.小组分工合作 2.观察小吊车模型组装各部分①四个点要对称,固定牢固;②绳子要从前往后穿,不要穿反了; 3.调试小吊车分别拉动两根线,看看小吊车的臂能否灵活运动. 实验现象:小吊车能提起或放下钩码实验结论:放松上牵引绳,拉紧下牵引绳,吊臂向下运动;拉紧上牵引绳,放松下牵引绳,吊臂向上运动。活动2:收与放实验目的:推断动物与人的肢体运动原理(分组实验) 实验过程: 1. 弯曲手臂,感受上臂上下肌肉的长短松紧变化。 2.伸直手臂,感受上臂上下肌肉的长短松紧变化。 3.反复几次体会与小吊车的原理的联系。实验现象:手臂骨骼就像小吊车的吊臂,肌肉就像绳子,手臂运动时,当肱二头肌收缩,肱三头肌舒张时,肱二头肌牵动前臂向内收缩;当肱三头肌收缩,肱二头肌舒张时,肱三头肌牵动前臂向外伸展. 实验结论:前臂收缩类似小吊车抬起重物。前臂伸展类似小吊车放下重物。6课.做沙盘(分组实验)制作目的:通过制作校园沙盘模型培养学生的设计制作能力。制作材

料:硬纸板学校平面图橡皮泥潮湿的沙土废旧泡沫包装纸小木棍颜料盒剪刀制作步骤:对校园建筑的布局进行观测2.用大的硬纸板做底座。在纸板上画好学校平面图。(明确建筑物.树木等的位置) 3.用橡皮泥旧泡沫等材料做出立体的楼房等校园建筑物,根据平面图摆放好位置。(可以用长方体或正方体的泡沫做楼房,硬纸板做围墙,小木棍做旗杆等)。4.要注意建筑物的比例。(四年级的学生还不能很精确地计算出比例尺,教师适当指导。)8课.快与慢实验目的:研究小车运动的快慢(分组实验) 实验材料:秒表(或电子手表)、长尺、玩具车(学生自带),橡皮泥,马达、电池等(学生自带)实验过程: 1.小组做好分工:赛车手、计时员、测量员、记录员。 2.找好起点(必要时确定好终点); 3.秒表做好归零; 4.在相同时间内必须进行多次测量(不少于3次),并做好记录 5. .在相同距离内必须进行多次测量(不少于3次),并做好记录实验结论:1:相同时间内经过的距离越长,物体运动的速度越快2:相同距离下所用的时间越短,物体运动的速度越快活动2:玩小车实验目的:研究小车运动的快慢与载重物及路面光滑程度是否有关?(对比试验) 实验材料:秒表(或电子手表), 木板, 玩具车(学生自带),钩码, 毛巾. 实验方法:1做好小组分工:赛车手、计时员、记录员; 2先测量空车时小车在木板上运动时间; 3别的条件不变,向小车上加钩

《算法设计与分析》实验报告

算法设计与分析课程实验项目目录 学生:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。

本科实验报告专用纸 课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号实验项目类型设计实验地点机房 学生学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间2012年3月1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人 H.E.Dudeney(1857-1930)给出的: S END +MORE MONEY . 这里有两个前提假设: 第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。)

该算法程序代码如下: #include "stdafx.h" #include "time.h" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l

贪心算法解汽车加油问题实验报告

计算机算法与分析 设计报告 班级:信管一班信管二班 姓名(学号):赵立贺(060340219) 赵艳(060340114)刘辉(060340125)王勇(060340116)万玉琪(060340213)刘旺(060340205)指导教师:赵晓峰姚天祥 设计地点:信息系统实验室 信息管理系 2008年12月13日

一、实验名称: 用贪心算法、回溯算法、动态规划等解决汽车加油次数最少问题。 二、实验目的: 课程设计是《计算机算法与设计》课程不可缺少的重要实践性环节。通过实践教学,要达到以下目的: (1)使学生掌握线性表、栈、队列、串、树、二叉树、图、集合等各种典型抽象数据类型的数学模型及其所支持基本运算的实现方法; (2)使学生掌握以抽象数据类型为模块的面向对象程序设计方法; (3)使学生提高对实际问题的分析、设计和实现能力; (4)为学生后续课程的学习及课程设计打下坚实的实践基础。 三、使用的策略: 贪心算法、回溯算法等。 四、实验内容: (一)问题描述 一辆汽车加满油后可以行驶N千米。旅途中有若干个加油站。指出若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。 给出N,并以数组的形式给出加油站的个数及相邻距离,指出若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。要求:算法执行的速度越快越好。 (二)问题分析(前提行驶前车里加满油) 对于这个问题我们有以下几种情况:设加油次数为k,每个加油站间距离为a[i];i=0,1,2,3……n 1.始点到终点的距离小于N,则加油次数k=0; 2.始点到终点的距离大于N, A 加油站间的距离相等,即a[i]=a[j]=L=N,则加油次数最少k=n; B 加油站间的距离相等,即a[i]=a[j]=L>N,则不可能到达终点; C 加油站间的距离相等,即a[i]=a[j]=L

算法与设计实验报告

算法与分析实验报告软件工程专业 安徽工业大学 指导老师:许精明

实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 一:实验目的 1:掌握动态规划算法的基本思想,学会用其解决实际问题。 2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。 二:实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 实验一:杨辉三角

问题分析: ①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 ②第n行数之和为2^n。 ③下一行每个数字等于上一行的左右两个数字之和。 算法设计及相关源代码: public void yanghui(int n) { int[] a = new int[n]; if(n==1){ System.out.println(1); }else if(n==2) { System.out.print(1 + " " +1); }else{ a[1]=1; System.out.println(a[1]); a[2]=1;

System.out.println(a[1]+" "+a[2]); for(int i=3;i<=n;i++){ a[1]=a[i]=1; for(int j=i-1;j>1;j--){ a[j]=a[j]+a[j-1]; } for(int j=1;j<=i;j++){ System.out.print(a[j]+" "); } System.out.println(); } } } 实验结果:n=10 实验二:0-1背包问题 问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就 j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j

哈工大机电产品现代设计方法实验报告

1 实验目的 (1)掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台; (2)自主设计产品模型、分析过程、优化目标; (3) 对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 2 实验内容 (1) 轴或负载台的有限元分析 (2) 基于Adams的运动学分析与仿真 3实验相关情况介绍(包含使用软件或实验设备等情况) 网络协同设计环境,如图1所示:包括产品CAD建模、有限元分析FEM、动力学仿真ADAMS和控制仿真MATLAB。计算机网络硬件环境和相应软件环境。图形工作站和路由器,安装协同设计仿真软件。 型 图1 协同设计仿真平台组成

典型机电产品协同设计仿真工作流程如下图2所示。 1)利用CAD建模工具,建立产品模型; 2)利用ADAMS建立产品运动学模型; 3)根据CAD和ADAMS传过来的结构模型和边界条件分析零件应力场和应变场;4)用ADAMS分析得到的运动参数(位移、速度)。 CAD模型 (STEP / IGES格式) 1.产品CAD建模 (CATIA) 3.CAE有限元分 析 (CATIA) FEM 分析结果 (应力、应变、模态) 2.动力学分析 (ADAMS) 驱动力、反应 时间 有限元输入载荷 4.控制仿真 (MATLAB) 运动参数:位 移、速度 动力参数:惯 量、载荷 图2 协同设计仿真平台组成 SysML语言是UML语言(Unified Modeling Language,统一建模语言,一种面向对象的标准建模语言,用于软件系统的可视化建模)在系统工程应用领域的延续和扩展,是近年提出的用于系统体系结构设计的多用途建模语言,用于对由软硬件、数据和人综合而成的复杂系统的集成体系结构进行可视化的说明、分析、设计及校验。 在这里我们绘制参数图如下。在下面的参数图中,我们确定了系统中各部件的相互约束情况。

算法设计与分析实验报告

算法设计与分析实验报告 教师: 学号: 姓名:

实验一:串匹配问题 实验目的:(1) 深刻理解并掌握蛮力法的设计思想; (2) 提高应用蛮力法设计算法的技能; (3) 理解这样一个观点: 用蛮力法设计的算法, 一般来说, 经过适度的努力后, 都可以对算法的第一个版本进行一定程度的改良, 改进其时间性能。 三、实验要求:( 1) 实现BF 算法; (2 ) 实现BF 算法的改进算法: KMP 算法和BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析, 并设计实验程序验证 分析结果。 #include "stdio.h" #include "conio.h" #include //BF算法 int BF(char s[],char t[]) { int i; int a; int b; int m,n; m=strlen(s); //主串长度 n=strlen(t); //子串长度 printf("\n*****BF*****算法\n"); for(i=0;i

算法设计实验报告(川大陈瑜)

《算法设计》课程报告 课序号: 01 学号: 2012141461134 姓名:刘佳玉 任课教师:陈瑜 评阅成绩: 评阅意见: 提交报告时间:2014年 6 月 16 日

贪心算法 1、问题描述 (这是我在soj上找的一道题,以前没做出来,现在用贪心的思想做出来了) 约翰要去钓鱼。他有h小时可用(1≤h≤16),在这个地区有n个湖泊(2≤n≤25),所有的湖泊沿着一条单行道可到达。约翰从湖泊1开始,他可以在任何湖泊结束。他只能从一个湖,到下一个,但他没有必要停在任何湖除非他想停。对于每个i = 1,……,n-1,ti 表示从湖i到湖i+1的5分钟的时间间隔(0 < ti < = 192)。例如,t3 = 4意味着它从湖3湖4需要20分钟的时间。 为了帮助他们规划自己的钓鱼旅行,约翰已经收集了一些关于湖泊信息。对于每个湖泊的i,能钓到的鱼在最初的5分钟的数量,用fi表示(fi > = 0),是已知的。每钓5分钟的鱼,能钓到的鱼在接下来的5分钟的间隔降低一个恒定的数di(di>=0)。如果能钓到的鱼在一个时间区的数量小于或等于di,将不会有更多的鱼留在湖里在下一个时间间隔。为了简化规划,约翰认为没有人会在影响他期待钓到的鱼的数量的湖里钓鱼。 写一个程序来帮助约翰计划他的最大化期望钓到的鱼的数量的钓鱼之旅。在每个湖花费的时间数必须是5的倍数。 这个问题包含多个测试案例! 一个多输入的第一行是一个整数N,然后一个空白行后的N个输入块。每个输入块由问题描述中的格式表示的。每个输入块之间有一个空行。 输出格式包含N个输出块。输出块之间要有一个空白行。 输入 在输入中,会给你一个案例输入的数量。每一种情况下,以n开始,其次是h,接下来有一行n个整数指定fi(1 < =i< = n),然后有一行n个整数di(1≤i<=n),最后,有一行n - 1的整数ti(1≤i<=n-1)。输入在n=0的情况下终止。 输出

相关主题
文本预览
相关文档 最新文档