算法设计与分析实验指导2014版
算法分析与设计A实验指导书_张怡婷2014_

//最后一个元素为哨兵∞
} 2、分析这两种排序算法在最好、最坏和平均情况下的时间复杂度。 两路合并排序:最好、最坏、平均情况下的时间复杂度均为 O(nlogn) 。 快速排序:最好、平均情况下的时间复杂度为 O(nlogn) ,最坏情况下为 O(n2 )。 3、当初始序列是递增或递减次序排列时,通过改进主元(基准元素)的选择方法,可以提 高快速排序算法运行的效率,避免最坏情况的发生。 有三种主元选择方式。 一是取 K(left+right)/2 为主元; 二是取 left~right 之间的随机整数 j,以 Kj 作为主元; 三是取 Kleft 、K(left+right)/2 和 Kright 三者的中间值为主元。 试选择其中的一种, 在原程序的基础上修改实现。 下面给出第二种主元选择方式的具体 实现: 随机数的产生是由 srand 函数以 time 函数值(即当前时间)作为种子,rand 函数产生 一个 0-RAND_MAX 范围内的随机数。 因此文件的开头应包含两个头文件 time.h 和 stdlib.h 。 为了不改动原有程序的基本结构,在原有程序上增加一个 RandomizedPartition 函数。 由 QuickSort 先调用该函数,产生一个 left~ right 范围内的随机下标 i,将该下标处的元 素 Kj 和原有的主元 Kleft 交换,然后照常调用原有的 Partition 函数即可。 void SortableList::QuickSort(int left,int right) { 。 。 。 。 。 。 int j=RandomizedPartition(left,right); //调用 RandomizedPartition 函数 。 。 。 。 。 。 } int SortableList::RandomizedPartition(int left, int right) { srand( (unsigned)time(NULL)); int i=rand()%(right-left)+left; Swap(i,left); return Partition(left, right); } //用当前时间作为种子 //产生一个 left~right 范围内的随机数 //调用 Partition 函数
算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。
2、掌握算法渐近复杂性的数学表述。
3、掌握用C++语言描述算法的方法。
4.实现具体的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6 页用数字6 表示,而不是06 或006 等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。
编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。
把这些结果统计起来即可。
四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。
《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。
1、求n个元素的全排。
(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。
(30分)3、设有n=2k个运动员要进行网球循环赛。
设计一个满足要求的比赛日程表。
(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。
三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
算法分析与设计实验指导书

《算法分析与设计》实验指导书《算法分析与设计》课程是计算机专业的一门必修课程。
开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。
《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。
(2)认真书写实验报告。
实验报告包括实验目的和要求,实验情况及其分析。
(3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。
(4)实验课程不迟到。
如有事不能出席,所缺实验一般不补。
《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。
第一部分是上机操作,包括检查程序运行和即时提问。
第二部分是提交电子的实验报告。
实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。
二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。
n个硬币中有一个是伪造的。
你的任务是找出这个伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。
算法设计与分析实验指导书

实验一串匹配程序设计(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). 在掌握的基础上编程两种排序方法的实现过程二、实验内容给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。
《算法分析与设计》实验指导与报告书-2014-15春季

常熟理工学院《算法分析与设计》实验指导与报告书__________学年第____学期专业:___________________________________ 学号:___________________________________ 姓名:___________________________________实验地点:___________________________________指导教师:____________刘在德_________计算机科学与工程学院2015.03.06实验目录实验1求最大公约数 0实验2斐波那契数列 (1)实验3 *最近对问题* (2)实验4 堆排序 (3)实验5霍纳法则和二进制幂 (3)实验6字符串匹配问题 (4)实验7 Warshall算法和Floyd算法 (5)实验8 最优二叉查找树 (6)实验9 *Huffman编码* (7)实验10 求解非线性方程 (8)实验11*投资问题* (9)注:(1)独立完成6个实验就可通过实验考核;(2)实验4和实验5为变治法应用,建议二选一;(3)实验7和实验8为动态规划法应用,建议二选一;(4)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。
实验1求最大公约数实验2斐波那契数列实验3 *最近对问题*实验4 堆排序实验5霍纳法则和二进制幂实验6字符串匹配问题实验7 Warshall算法和Floyd算法实验8 最优二叉查找树实验9 *Huffman编码*实验10 求解非线性方程实验11*投资问题*世上没有一件工作不辛苦,没有一处人事不复杂。
不要随意发脾气,谁都不欠你的。
算法设计与分析实验指导书

<<算法设计与分析>>实验指导书实验一、回溯法一、实验目的掌握回溯法求解问题的思想,学会利用其原理求解相关问题。
二、实验内容及要求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];}}时间复杂度:通常情况下用自然合并排序所需要的合并次数较少。
算法设计与分析实验报告华北电力大学

华北电力大学实验报告||实验名称算法设计与分析实验课程名称算法设计与分析||专业班级:计科1203 学生姓名:学号:成绩:指导教师:牛为华实验日期:2014年10月实验一、矩阵连乘一、实验目的及要求1、了解并掌握动态规划算法解矩阵连乘问题的原理;2、通过上机实验,对矩阵连乘的知识进行巩固;3、用程序实现矩阵连乘。
二、实验原理1、两个矩阵相乘,第一个矩阵的列数=第二个矩阵的行数;2、三个矩阵相乘时:A1 * A2 * A3 =((A1 * A2 ) * A3 )A1 * A2 * A3 =(A1 * ( A2 * A3 ))不同的运算顺序,所需的乘法次数就不一样;在算分设计与 分析中,我们知道,乘法的次数越多,消耗的空间就越大,所需 的时间就越多。
3、当多个矩阵相乘时:我们假设M i ,j 就是第i 个矩阵到第j 个矩阵的矩阵连乘, 即M i ,j =M i M i+1 …… M j选中一个k 值,i<=k<=j ,使得:M i ,k-1 = M i M i+1…M k-1,M k ,j =M k M k+1…M j用数组C[i][j]表示第i 个矩阵到第j 个矩阵的矩阵连乘 最优解,有:111],[]1,1[{min ],1[+≤<++-=n k nk r r r n k C k C n C }],[]1,[{min ],[1+≤<++-=j k i j k i r r r j k C k i C j i C三、问题分析及算法设计思路1、计算最优值算法:建立两张表(,一张表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵…、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n个矩阵相乘的最小运算量;另一张表存储最优断开位置。
2、输出矩阵结合方式算法:矩阵结合即是给矩阵加括号,打印出矩阵结合方式,由递归过程完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析
设计与实验
王 源
二0一四年十月
实验一:分治算法及其应用
实验要求:
掌握分治算法的原理.
掌握递归算法及递归程序的设计.
能用程序设计语言设计求解典型问题的算法
实验题:
1、棋盘覆盖问题:在一个2k ×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
用图示的4种不同形态的L 型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L 型骨牌不得重叠覆盖。
2、最近对问题:设p 1=(x 1,y 1), p 2=(x 2,y 2), …, p n =(x 1,y 1),是平面上n 个点构成的集合S ,最近对问题就是找出集合S 中距离最近的点对。
3、(选作)最大子段和问题:给定由n 个整数(可能有负整数)组成的序列(a 1, a 2, …, a n ),
最大子段和问题要求该序列形如 的最大值(1≤i ≤j ≤n ),当序列中所有整数均为负
整数时,其最大子段和为0。
例如,序列(-20, 11, -4, 13, -5, -2)的最大子段和为 。
∑=j
i k k a ∑==4
220
k k a
实验要求:
基本动态规划法的原理方法;
能用程序设计语言实现求解背包问题的算法
实验题:
1、最长公共子序列问题:对给定序列X=(x1, x2,…, xm)和序列Z=(z1, z2,…, zk),Z是X的子序列当且仅当存在一个递增下标序列(i1, i2,…, ik),使得对于所有j=1, 2, …, k,有(1≤ij ≤m)。
给定两个序列X和Y,当序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列最长公共子序列问题就是在序列X和Y中查找最长的公共子序列。
2、(选作)多段图的最短路径问题:设图G=(V, E)是一个带权有向图,如果把顶点集合V 划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m (1≤i≤k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。
多段图的最短路径问题求从源点到终点的最小代价路径。
3、
实验要求:
掌握贪心及回溯法解题的基本思想;
掌握贪心及回溯算法的设计方法;
熟练掌握贪心及回溯递归算法、迭代算法的设计与实现。
实验题:
1、图着色问题:给定无向连通图G=(V, E),求图G的最小色数k,使得用k种颜色对G中的顶点着色,可使任意两个相邻顶点着色不同。
2、n皇后问题:在n×n格的棋盘上放置彼此不受攻击的n个皇后。
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
给出所有可行解。
随机输出2个可行解的图形。
其中棋盘要有含8×8的格子的不少于两种,Queen图像自选;估算该算法的效率。
实验要求:
掌握分支限界法算法的解题的基本思想和设计方法;
理解分支限界法算法中的限界函数应遵循正确、准确、高效的设计原则
实验题:
1、0-1背包问题的优先队列式(最大堆)分支限界求法:已知有N个物品和一个可以容纳M重量的背包,每种物品I的重量为WEIGHT,一个只能全放入或者不放入,求解如何放入物品,可以使背包里的物品的总效益最大。
输入:第一行有2个正整数n和c。
n是物品数,c是背包的容量。
接下来的1 行中有n个正整数,表示物品的价值。
第3 行中有n个正整数,表示物品的重量。
输出:将计算出的装入背包物品的最大价值和最优装入方案输出。
第一行输出为:Optimal value is
第二行输出:装入背包物品的最大价值。
第三行输出:最优装入方案。
输入样例:
5 10
6 3 5 4 6
2 2 6 5 4
输出样例:
Optimal value is
15
1 1 0 0 1
2、圆排列问题(选作)
复习练习
复习练习
1、证明n !=o(n n
) 2、证明
)(32
122
n n n Θ=− 3、利用递归树证明下列递归式T (n )的渐近复杂度为)lg (n n Θ
T (n )= ⎩⎨
⎧>+=1
)2/(21n cn
n T n c
4、说明)2(2
1
n n O =+是否成立?
5、设计时间复杂度为O(n 2)和O(n)的两种算法,求s= 1!+2!+……n!
6、请用动态规划法,求解以下流水作业调度问题: n=4, (a 1, a 2, a 3, a 4)=(5,12,4,8), (b 1, b 2, b 3, b 4)=(6,2,14,7)。
7、已知序列X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>,构造A 和B 的LCS 问题的C(i,j)矩阵。
8、已知R= {r 1,r 2,r 3,……,r rn },编写一个递归程序输出其全排列。
9、试设计一个O(n)时间算法,使之能产生数组a [0:n-1]元素的一个随机排列。
10、给定由n 个互不相同的数组成的集合S ,及一个正整数k<=n ,试设计一个O(n)时间算法找出S 中最接近S 的中位数的k 个数。
11、请用贪心法,求解以下Knapsack 问题:
n=7,C=15,(p 1, p 2, p 3, p 4, p 5, p 6, p 7)=(10,5,15,7,6,18,3), (w 1, w 2, w 3, w 4, w 5, w 6, w 7)=(2,3,5,7,1,4,1)。
12、试设计一个解最大团问题的非递归迭代回溯法。
13、给定一个赋权无向图G=(V ,E),每个顶点v ∈V 都有一个权值w(v)。
如果v ∈V ,且对任意(u,v)∈E 有u ∈U 或v ∈U ,就称U 为图G 的一个顶点 覆盖。
G 的最小权顶点覆盖是指G 中所含顶点权之和最小的顶点覆盖。
对于给定的无向图G ,设计一个优先队列分支限界法,计算G 的最小权顶点覆盖。
14、设有n 间工作分配给n 个人。
将工作i 分配给第j 个人所需的费用为cij 。
试设计一个算法,为每一个人都分配1件不同的工作,并使总费用达到最小。
15、设某一机器由n 个部件组成,每一种部件都可以从m 个不同的供应商处购得。
设wij 是从供应商j 处购得的部件i 的重量,cij 是相应的价格。
设计一个优先队列式分支限界法,给出总价格不超过d 的最小重量机器设计。