《算法分析与设计》实验指导书

合集下载

算法分析与设计实验指导书

算法分析与设计实验指导书

《算法分析与设计》实验指导书《算法分析与设计》课程是计算机专业的一门必修课程。

开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。

《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。

《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。

(2)认真书写实验报告。

实验报告包括实验目的和要求,实验情况及其分析。

(3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。

(4)实验课程不迟到。

如有事不能出席,所缺实验一般不补。

《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。

第一部分是上机操作,包括检查程序运行和即时提问。

第二部分是提交电子的实验报告。

实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。

二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。

三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。

n个硬币中有一个是伪造的。

你的任务是找出这个伪造的硬币。

为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。

试用分治法的思想写出解决问题的算法,并计算其时间复杂度。

2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。

售货员希望用数目最少的硬币找给小孩。

假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。

算法设计与分析实验指导书

算法设计与分析实验指导书

算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院2012年.. .专业. .目录算法设计与分析 (1)实验指导书 (1)前言 (3)实验要求 (4)实验1 分治法的应用(2学时) (5)1.实验目的 (5)2.实验类型 (5)3.预习要求 (5)4.实验基本要求 (5)5.实验基本步骤 (7)实验2动态规划(2学时) (9)1.实验目的 (9)2.实验类型 (9)3.预习要求 (9)4.实验基本要求 (9)5.实验基本步骤 (10)实验3 回溯法(4学时) (12)1.实验目的 (12)2.实验类型 (12)3.预习要求 (12)4.实验基本要求 (12)5.实验基本步骤 (13)前言《算法设计与分析》是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。

通过对计算机算法系统的学习,使学生理解和掌握计算机算法的通用设计方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定基础。

要求掌握算法复杂度分析、分治法、动态规划法、贪心法、回溯法、分支限界法等算法的设计方法及其分析方法。

能将这些方法灵活的应用到相应的问题中,并且能够用C++实现所涉及的算法,并尽量做到低复杂度,高效率。

通过本课程的实验,使学生加深对课程容的理解,培养学生严密的思维能力,运用所学知识结合具体问题设计适用的算法的能力;培养学生良好的设计风格,激励学生创造新算法和改进旧算法的愿望和热情。

希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。

希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《算法设计与分析》课程成为对大家有益的课程。

实验要求《算法设计与分析》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深理解和更好地掌握《算法设计与分析》课程教学大纲要求的容。

在《算法设计与分析》的课程实验过程中,要求学生做到:(1)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。

《算法分析与设计》实验指导书(8学时)

《算法分析与设计》实验指导书(8学时)

计算机科学与技术学院算法分析与设计实验指导书2011年8月于洪编写2015年9月周应华修订目录实验一分治策略排序 (3)实验二减治策略查找顺序表 (5)实验三动态规划求解0/1背包问题 (8)实验四贪心算法求解最短路径问题 (10)附录1 关于文件的操作 (12)附录2 关于如何统计运算时间 (13)实验一分治策略排序实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。

实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。

这些数作为本算法实验的输入数据。

2.实现合并排序算法要求:实现mergesort算法。

输入:待排数据文件data.txt;输出:有序数据文件resultsMS.txt(注:建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。

合并排序算法(类C语言):/* 数组A[] 中包含待排元素;array B[] is a work array */TopDownMergeSort(A[], B[], n){TopDownSplitMerge(A, 0, n, B);}// iBegin is inclusive; iEnd is exclusive (即:A[iEnd]不是待排元素)TopDownSplitMerge(A[], iBegin, iEnd, B[]){if(iEnd - iBegin < 2) // 如果只有1个待排元素,返回。

return;// recursively split runs into two halves until run size == 1,// then merge themiMiddle = (iEnd + iBegin) / 2; // 划分TopDownSplitMerge(A, iBegin, iMiddle, B);TopDownSplitMerge(A, iMiddle, iEnd, B);TopDownMerge(A, iBegin, iMiddle, iEnd, B); // 合并;元素放到数组B中。

算法设计与分析实验指导书

算法设计与分析实验指导书

实验一串匹配程序设计(2学时)一、实验目的(1). 熟练掌握串匹配的含义(2). 掌握BF算法匹配的过程并编程实现(3). 熟悉C++编译环境的基本操作二、实验内容给定两个字符串S和T,用BF算法,在主串S中查找字串T,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(匹配成功或不成功)(3)、写出完整的程序四、实验结果实验二排序问题程序设计(2学时)一、实验目的(1). 掌握选择排序和起泡排序的基本思想(2). 掌握两种排序方法的具体实现过程(3). 在掌握的基础上编程实现两种排序方法二、实验内容输入一个待排序的序列,分别用选择排序和起泡排序两种排序方法将其变换成有序的序列,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(序列本身已是有序序列,序列不是有序序列)(3)、写出完整程序四、实验结果实验三数字旋转方阵程序设计(2学时)一、实验目的(1). 掌握分治法的设计思想(2). 掌握数字旋转方阵的具体实现过程(3). 熟练掌握二维数组的使用方法(4). 在掌握的基础上编程实现数字旋转方阵的实现过程二、实验内容给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(方阵有一层,两层或更多层)(3)、写出完整程序四、实验结果实验四排序中分治法的程序设计(2学时)一、实验目的(1). 掌握归并排序和快速排序的划分方法(2). 掌握归并排序和快速排序的具体分治策略(3). 在掌握的基础上编程两种排序方法的实现过程二、实验内容给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。

算法设计与分析课程实验指南

算法设计与分析课程实验指南

《算法设计与分析》课程实验指南(适合于非计算机科学与技术专业)实验项目1 串匹配问题1.实验题目给定一个文本,在该文本中查找并定位任意给定字符串。

2.学时安排2个学时。

3.实验目的(1)深刻理解并掌握蛮力法的设计思想;(2)提高应用蛮力法设计的技能;(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。

4.实验要求(1)实现BF算法;(2)实现BF算法的改进算法:KMP算法;(3)对上述2个算法进行时间复杂性分析,并设计实验程序验证分析结果。

实验项目2 最近对问题1.实验题目设p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近点对。

2.学时安排2个学时。

3.实验目的(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

4.实验要求(1)分别用蛮力法和分治法求解最近对问题;(2)分析算法的时间性能,设计实验程序验证分析结论。

实验项目3 八枚硬币问题1.实验题目在8枚外观相同的硬币中,有一枚是人民币假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。

可以通过一架天平来任意比较两组硬币,设计一个高效的算法来测出这枚假币。

2.学时安排2个学时。

3.实验目的(1)深刻理解并掌握减治法的设计思想;(2)提高应用减治设计算法的技能;(3)理解这样一个观点:建立正确的模型对于问题的求解是非常重要的。

4.实验要求(1)设计减治算法实现8枚硬币问题;(2)设计测试数据,写出程序文档。

实验项目4 0/1背包问题1.实验题目给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品总价值最大。

2.学时安排2个学时。

《算法分析与设计》实验指导书

《算法分析与设计》实验指导书

计算机算法分析与设计实验指导书
杨红云
适用专业:软件工程
江西农业大学软件学院
计算机算法分析与设计实验指导书
计算机算法分析与设计是面向设计的,它是计算机科学和软件工程应用的核心。

无论是计算机系统、系统软件和解决计算机的各种应用课题都可归结为算法的设计。

通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的精确的描述:分治法、贪心法、动态规划、回溯法等。

并掌握算法分析的方法。

从而将学生分析问题和解决问题的能力提高到高层理论的高度。

前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。

实验学时:16学时。

算法设计与分析实验指导书

算法设计与分析实验指导书

<<算法设计与分析>>实验指导书实验一、回溯法一、实验目的掌握回溯法求解问题的思想,学会利用其原理求解相关问题。

二、实验内容及要求1、八皇后问题八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。

该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

高斯认为有76种方案。

1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

要求对用C实现的回溯法进行验证,并使其能扩展到任意的皇后数的情况,同时对源程序给出详细的注释。

三、实验步骤1. 理解算法思想和问题要求;2. 编程实现题目要求;3. 上机输入和调试自己所编的程序;4. 验证分析实验结果;5. 整理出实验报告。

四、实验源代码1、八皇后问题(回溯法实现)#define QUEENNO 8#define MAXNO 32#include <stdio.h>#include <stdlib.h>int X[MAXNO];char D[MAXNO][MAXNO];int count=0;void initiate(int n);void nqueen(int n);void display(int n);main(){int queenno=QUEENNO;initiate(queenno);nqueen(queenno);printf("共有%d个解,解已经保存在D盘文件result.txt中\n",count); }void initiate(int n){int i;for(i=0;i<n;i++)X[i]=-1;return;}void nqueen(int n){ int k;X[0]=0;k=0;while(k>=0){X[k]++;while(X[k]<=n&&!place(k)){X[k]++;}if(X[k]<=n){ if(k==n-1) display(n);else {k++;X[k]=0;}}else{ k--;}}}int place(int k){int i;i=0;while(i<k){if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k)))return 0;i++;}return 1;}void display(int n){FILE *fw;int i,j;count++;fw=fopen("D:\\result.txt","a");for(i=0;i<n;i++)for(j=0;j<n;j++)D[i][j]='o';for(i=0;i<n;i++)D[i][X[i]-1]='*';fprintf(fw,"%d\n",count);fprintf(fw,"-------------------------\n");for(i=0;i<n;i++)for(j=0;j<n;j++){if(j==n-1)fprintf(fw,"%c \n",D[i][j]);else fprintf(fw,"%c ",D[i][j]); }fprintf(fw,"-------------------------\n");fclose(fw);return;}实验二:分治法(2学时)问题陈述:对所给元素存储于数组中和存储于链表中两中情况,写出自然合并排序算法.解题思路:将待排序元素分成大小大相同的两个集合,分别对两个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.自然排序是通过一次扫描待排元素中自然排好序的子数组,再进行子数组的合并排序.程序代码:#include <iostream.h>const int N=100;void ScanTarget(int target[], int n, int head[], int tail[]);int CountHead(int head[]);void MergeSort(int a[], int head[], int tail[], int m);void MergePass(int x[], int y[], int s, int a[], int b[], int m);void Merge(int c[], int d[], int l, int m, int r);void main(){char a;do{int target[N],head[N],tail[N];int i=0,n,m;for(; i<N; i++){head[i]=-1;tail[i]=-1;}cout<<"请输入要排序的总数:"<<endl;cin>>n;cout<<"请输入要排序的数列:" <<endl;for(i=0; i<n; i++)cin>>target[i];ScanTarget(target,n,head,tail);m=CountHead(head);MergeSort(target,head,tail,m);cout<<"排序后:"<<endl;for(i=0; i<n; i++)cout<<target[i]<<" ";cout<<endl;cout<<"是否继续(y/n):"<<endl;cin>>a;}while(a!='n' && a!='N');}void ScanTarget(int target[], int n, int head[], int tail[])//扫描待排数组;{int i,j=0,k=0;head[k]=0;k++;for(i=1;i<n;i++){if(target[i-1]>target[i]){tail[j++]=i-1;head[k++]=i;}}tail[j]=n-1;}int CountHead(int head[])//求长度;{int i(0);while(head[i]!=-1){i++;}return i;}void MergeSort(int a[], int head[], int tail[], int m){int b[N];int s=1;while(s<m){MergePass(a,b,s,head,tail,m);s+=s;MergePass(b,a,s,head,tail,m);s+=s;}}void MergePass(int x[], int y[], int s, int a[], int b[], int m){int i=0;while(i <= m-2*s){Merge(x,y,a[i],b[i+s-1],b[i+2*s-1]);i=i+2*s;}if(i+s < m){Merge(x,y,a[i],b[i+s-1],b[m-1]);}else{for(int j=i; j<m; j++)for(int k=a[j]; k<=b[j]; k++)y[k]=x[k];}}void Merge(int c[], int d[], int l, int m, int r){int i,j,k;i=l;j=m+1;k=l;while((i<=m) && (j<=r)){if( c[i] <= c[j] )d[k++]=c[i++];else d[k++]=c[j++];}if( i>m ){for(int q=j; q<=r; q++)d[k++]=c[q];}else{for(int q=i; q<=m; q++)d[k++]=c[q];}}时间复杂度:通常情况下用自然合并排序所需要的合并次数较少。

算法分析与设计》实验指导与报告书

算法分析与设计》实验指导与报告书

《算法分析与设计》实验指导与报告书实验目录实验1 求最大公约数 (1)实验2 斐波那契数列 (3)实验3 最近对问题 (6)实验4 堆排序 (7)实验5 霍纳法则和二进制幂 (8)实验6 字符串匹配问题 (9)实验7 Warshall算法和Floyd算法 (10)实验8 最优二叉查找树 (11)实验9 Huffman编码* (12)实验10 求解非线性方程* (13)实验11 投资问题* (14)注:(1)实验4和实验5为变治法应用,二选一;(2)实验7和实验8为动态规划法应用,二选一;(3)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。

实验1 求最大公约数{c = a;a = b;b = c;}while(a % b != 0){c = a % b;a = b;b = c;}printf("%d", b);return 0;}连续整数检测算法最大公约数算法:#include <stdio.h>int main(){int a,b,t;printf("Please input two integers: ");scanf("%d %d",&a,&b);if(a<b)t=a;elset=b;while(t>=1){if((a%t==0)&&(b%t==0))break;t--;}printf("%d",t);return 0;}相减循环:#include<stdio.h>int main(){int m,n;printf("Please input two integers: ");scanf("%d%d",&m,&n);while(m!=n)if(m>n) m=m-n;else n=n-m;printf("%d",m);return 0;}教师评分实验2 斐波那契数列实验目的(1)求斐波那契数列;(2)区分递归和递推思想。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机算法设计与分析》实验指导书(第一版)前言计算机算法分析与设计是面向设计的,它是计算机科学的核心。

无论是计算机系统、系统软件和解决计算机的各种应用问题都可归结为算法的设计。

通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的算法描述:分治法、贪心法、动态规划、回溯法、分枝限界等算法,并掌握算法分析的方法,从而把学生的分析问题和解决问题能力提高到理论的高度。

前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。

开发环境不限,本书采用C/C++语言的集成开发环境等。

实验完成后书写实验报告,包含实验问题、基本思想、关键算法流程图、测试数据及运行结果(截图)、调试心得和源程序。

总实验学时为16学时。

目录预备实验验证算法的方法 (4)实验目的: (4)实验课时: (4)实验原理: (4)实验题目: (6)基本题: (6)提高题: (6)实验一递归与分治 (7)实验目的: (7)实验课时: (7)实验原理: (7)实验题目: (7)基本题: (7)提高题: (8)思考问题: (8)实验二动态规划算法 (9)实验目的: (9)实验课时: (9)实验原理: (9)实验题目: (9)基本题: (9)提高题: (10)思考问题: (10)实验三贪心选择算法 (11)实验目的: (11)实验课时: (11)实验原理: (11)实验题目: (11)基本题: (11)提高题: (12)思考问题: (12)实验四回溯算法 (13)实验目的: (13)实验课时: (13)实验原理: (13)实验题目: (14)基本题: (14)提高题: (14)思考问题: (14)预备实验验证算法的方法实验目的:熟悉开发环境中文件、函数和头文件等的使用方法。

实验课时:2学时实验原理:算法常常以自定义函数形式给出的,要验证算法,需编写一个完整的源程序,通过调用函数来实现算法的功能.一般源程序的结构如下:文件包含预处理符号常量的定义类型定义//确定处理对象的数据结构返回类型自定义函数名(形式参数表) //自定义函数的定义,即算法{…}void main(){变量定义;//定义处理对象建立对象;//根据存储类型,给变量赋值(常通过文件实现),以确定具体的处理对象调用自定义函数;//引用函数对处理对象进行操作,实现算法的功能打印输出;//给出结果}在具体实现过程中,常常把类型定义和函数申明放在头文件中说明,所有函数(算法)实现放在一个源文件中,最后由一个主源文件调用。

例如单链表的逆置处理问题,头文件linklist.h文件为:typedef int elemtype;/*定义元素类型*/typedef struct linknode{elemtype data;struct linknode *next;}nodetype;/*定义结点类型,确定线性表的链式存储结构*/nodetype *create();/*通过读数据文件input.txt中的数据建立一个不带头结点的单链表,通过函数的值返回头指针*/void disp(nodetype *h); /*遍历显示以h为头指针的单链表*/void invert(nodetype *h);/*逆序打印单链表*/所有函数(算法)实现放在test.cpp源文件中,如:#include <stdio.h>#include <malloc.h>#include "linklist.h"nodetype *create(){。

}void disp(nodetype *h){。

}void invert(nodetype *h){。

}最后由一个主源文件main.cpp完成调用,如:#include <stdio.h>#include <malloc.h>#include "linklist.h"void main(){nodetype *head;/*定义变量head,以表示处理的单链表头指针*/elemtype x;head=create();/*建立单链表head*/disp(head);/*显示逆置前的单链表*/invert(head);/*逆序打印单链表*/}实验题目:基本题:用函数create()、disp(nodetype *h)、invert(nodetype *h) 实现不带表头和带表头单链表的逆置问题,即输入文件input.txt为1234输出为4 3 2 1 (可以用文件存放)提高题:用DFS 判断图是否连通,图中是否有环,readGraph( )从文件中读入图的信息;printGraph ( )以邻接表的形式显示图的信息;Connectivity_DFS(MGraph m)判断图是否连通;Cycle_DFS(MGraph m)判断图中是否有环存在。

图的信息如:可存储其信息在数据文件input.txt中,如下:1 21 31 42 4实验一递归与分治实验目的:理解递归与分治算法设计思想和方法。

实验课时:4学时实验原理:一个规模为n的复杂问题的求解:可以划分成若干个规模较小<n的子问题进行求解,再将子问题的解合并成原问题的解,这便是分治的思想。

若划分成的每一个子问题都与原问题的性质相同,可用相同的求解方法;当子问题规模划分一定小时,子问题的解已知,则逆求原问题的解,这是递归的思想。

实验题目:基本题:1、二分查找问题(1)设a[0:n-1]是一个已排好序的数组。

请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。

当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

(2)设有n个不同的整数排好序后存放于t[0:n-1]中,若存在一个下标i,0≤i <n,使得t[i]=i,设计一个有效的算法找到这个下标。

要求算法在最坏的情况下的计算时间为O(logn)。

2、快速排序问题在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。

3、设计一个递归算法生成n个元素的全排列提高题:1、汉诺塔(hanoi)问题。

设有A、B、C 共3 根塔座,在塔座A 上堆叠n个金盘,每个盘大小不同,只允许小盘在大盘之上,最底层的盘最大,如下图所示。

现在要求将 A 上的盘全都移到C 上,在移的过程中要遵循以下原则:每次只能移动一个盘;圆盘可以插在A、B 和 C 任一个塔座上;在任何时刻,大盘不能放在小盘的上面。

2、求正整数n的不同划分个数。

3、棋盘覆盖问题在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

思考问题:1.递归的关键问题在哪里?2.递归与非递归之间程序的转换?实验二动态规划算法实验目的:理解动态规划算法的思想实验课时:4学时实验原理:动态规划算法思想:把待求解问题分解成若干个子问题,先求解子问题,然后由这些子问题的解得到原问题的解,但动态规划求解过的子问题的结果会被保留下来,不像递归那样每个子问题的求解都要从头开始返回求解。

动态规划求解问题的关键在于获得各个阶段子问题的递推关系式:(1)分析原问题的最优解性质,刻画其结构特征(2)递归定义最优值(3)自底向上(由后向前)的方式计算最优值(4)根据计算最优值时得到的信息,构造一个最优解。

实验题目:基本题:1、矩阵连乘问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。

如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

如数据文件input.txt为:6(矩阵个数)30351551020252、最长公共子序列给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

提高题:1、用动态规划法求解0/1背包问题:给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?2、图像压缩:要求确定象素序列{p1,p2,…,pn}的最优分段,使得依此分段所需的存储空间最少。

每个分段的长度不超过256位。

思考问题:1、深刻理解动态规划与递归求解问题的区别?2、动态规划思想解题的步骤?实验三贪心选择算法实验目的:理解贪心选择算法的思想实验课时:4学时实验原理:贪心选择算法思想:(1)贪心选择能得到问题的最优解,要证明我们所做的第一步选择一定包含在一个最优解总,即存在一个最优解的第一步是从我们的贪心选择开始。

(2)在做出第一步贪心选择后剩下的子问题应该是和原问题类似的规模较小的子问题 为此我们可以用数学归纳法来证明贪心选择能得到问题的最优解。

实验题目:基本题:1、活动安排问题:设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源。

活动安排问题就是要在所给的活动集合中选出最大(尽可能多)的相容活动子集合。

2、用贪心算法解决背包问题:与0-1背包问题类似,不能将物品i装入背包多次,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包。

3、最优装载问题:有一批集装箱要装上一艘载重量为c的轮船。

其中集装箱i的重量为Wi。

最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

提高题:1、用贪心算法求解最小生成树:任选一种贪心算法(Prim或Kruskal),求解最小生成树。

编程实现,并给出测试实例2、多机调度问题:要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。

作业不能拆分成更小的子作业。

提示:1)把作业按加工所用的时间从大到小排序2)如果作业数目比机器的数目少或相等,则直接把作业分配下去3)如果作业数目比机器的数目多,则每台机器上先分配一个作业,如下的作业分配时,是选那个表头上s最小的链表加入新作业。

思考问题:1、贪心算法与动态规划思想解题的区别?2、哈夫曼编码问题的编程实现?实验四回溯算法实验目的:理解回溯算法的思想实验课时:2学时实验原理:回溯法的基本做法是搜索,或是一种组织得井井有条的、能避免不必要搜索的穷举式搜索法。

相关文档
最新文档