《算法设计与分析》实验指导
《算法设计与分析》实验指导书_bfm(全)
《算法设计与分析》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。
手编程序应书写整齐,并经人工检查无误后才能上机。
(2)、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
(3)、上机结束后,整理出实验报告。
实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。
本书共分阶段4个实验,每个实验有基本题和提高题。
基本题必须完成,提高题根据自己实际情况进行取舍。
题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其他题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。
其具体要求和步骤如下:实验一分治与递归(4学时)一、实验目的与要求1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解二、实验内容:掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。
三、实验题任意输入一个整数,输出结果能够用递归方法实现整数的划分。
四、实验步骤1.理解算法思想和问题要求;2.编程实现题目要求;3.上机输入和调试自己所编的程序;4.验证分析实验结果;5.整理出实验报告。
一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法二、实验题:盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
三、实验提示void chessBoard(int tr, int tc, int dr, int dc, int size) {if (size == 1) return;int t = tile++, // L型骨牌号s = size/2; // 分割棋盘// 覆盖左上角子棋盘if (dr < tr + s && dc < tc + s)// 特殊方格在此棋盘中chessBoard(tr, tc, dr, dc, s);else {// 此棋盘中无特殊方格// 用t 号L型骨牌覆盖右下角board[tr + s - 1][tc + s - 1] = t;// 覆盖其余方格chessBoard(tr, tc, tr+s-1, tc+s-1, s);}// 覆盖右上角子棋盘if (dr < tr + s && dc >= tc + s)// 特殊方格在此棋盘中chessBoard(tr, tc+s, dr, dc, s);else {// 此棋盘中无特殊方格// 用t 号L型骨牌覆盖左下角board[tr + s - 1][tc + s] = t;// 覆盖其余方格chessBoard(tr, tc+s, tr+s-1, tc+s, s);}// 覆盖左下角子棋盘if (dr >= tr + s && dc < tc + s)// 特殊方格在此棋盘中chessBoard(tr+s, tc, dr, dc, s);else {// 用t 号L型骨牌覆盖右上角board[tr + s][tc + s - 1] = t;// 覆盖其余方格chessBoard(tr+s, tc, tr+s, tc+s-1, s);}// 覆盖右下角子棋盘if (dr >= tr + s && dc >= tc + s)// 特殊方格在此棋盘中chessBoard(tr+s, tc+s, dr, dc, s);else {// 用t 号L型骨牌覆盖左上角board[tr + s][tc + s] = t;// 覆盖其余方格chessBoard(tr+s, tc+s, tr+s, tc+s, s);}}一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法;二、实验题1、设a[0:n-1]是一个已排好序的数组。
算法设计与分析实验指导
《算法设计与分析》实验指导书目录实验一单链表的建立插入及删除 (3)实验二多项式加法 (5)实验三集合的表示与操作算法设计 (7)实验四迷宫问题求解 (8)实验五树的建立及遍历 (11)实验六图的遍历的演示 (12)实验七哈希表的设计 (15)实验八Kruskal算法的设计 (17)实验九归并排序的分治策略设计 (19)实验十哈夫曼编码的贪心算法设计 (21)实验十一递归与迭代程序设计 (22)实验十二多段图问题的动态规划算法设计 (24)实验十三作业调度问题 (26)实验十四回溯算法设计 (28)实验十五搜索顺序的选择 (29)实验十六蛇和梯子 (31)实验十七游戏中寻址算法的设计 (34)实验十八旅行商问题 (36)实验十九骑士游历算法设计 (38)实验二十输油管道问题的设计与实现 (40)实验二十一邮局选址问题的设计与实现 (42)实验二十二会场安排问题的设计与实现 (44)实验二十三目录树打印程序的设计 (46)实验二十四最少演员问题 (48)附:实验(设计)报告参考格式 (50)实验一单链表的建立插入及删除[实验目的]1.掌握单链表的建立插入及删除的算法;2.进一步熟悉指针的用法;[预习要求]1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例。
[类型定义]typedef struct Lnode{int data;struct Lnode *next;}Lnode,*linklist;[实验提示]void create(link *h,int n){//创建单链表link p,q;int i;p=(link)malloc(sizeof(node));p->next=null;*h=p;q=p;for(i=1;i<=n;++i){p=(link)malloc(sizeof(node));scanf("%d",&p->data);p->next=null;q->next=p;q=p;}}void print(link h){//输出单链表link p;p=h->next;while(p){printf("%d ",p->data);p=p->next;}}void insertlist(linklist *L,int i,int e){//在单链表的第i个元素之前插入元素值为e的结点}void dellist(linklist *L,int i,int *e){//删除单链表的第i个结点,被删结点通过 e返回}[实验步骤]1.先用插表头或插表尾的方法建立单链表并输出,并测试你的程序,直至正确为止;2.再进行插入和删除程序的设计;3.将你的程序和实录的界面存盘备用。
算法设计与分析实验指导书
算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院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学时)
计算机科学与技术学院算法分析与设计实验指导书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中。
《算法设计与分析》实验大纲
《算法设计与分析》课程实验教学大纲Design and Analysis of Computer Algorithm总学时 16 总学分 0.5 实验学时 16一、基本情况1. 课程性质:专业实践2. 设课方式:独立设课3. 适用专业:计算机科学与技术专业4. 开课学期:第5学期5. 实验教材:《算法设计与分析》实验指导书6. 先修课程:高级语言程序设计、离散数学、数据结构二、课程简介算法设计与分析实验将覆盖计算机软件实现中的大部分算法,具有一定的深度和广度,目的是让学生掌握递归与分治策略、动态规划、贪心算法、回溯法、分支限界法等算法思想;能独立运用相关算法策略来分析、解决实际问题并编程实现。
同时,算法设计与分析实验是对学生在软件设计方面的综合训练,包括问题分析,总体结构设计,程序设计基本技能和技巧等,以培养良好的编程风格和科学作风。
通过理论联系实际,最终提高学生动手操作的能力以及分析问题和解决问题的能力,培养对算法的复杂性进行分析的逻辑思维能力。
三、实验目的与任务实验是教学内容的重要一环,其目的一方面是为了让学生掌握算法设计与分析中的一些常用的典型的算法设计思想和方法;另一方面是为了让学生切实掌握各种算法的具体实现方法,培养学生的实际动手能力,加强学生创新思维能力的培养。
四、课程的基本要求(1)了解实验目的,熟悉实验环境。
(2)预习实验,准备好实验题目和操作步骤。
(3)能编译调试源程序,分析错误原因并加以修改,得出正确结果。
(4)能运用所学的知识正确分析程序得出的结果,并能给出改进的方案。
(5)将上述各项要求及实验结果编写成实验报告。
实验前学生要认真预习实验内容,按要求编写源程序及准备测试数据。
实验中,要按操作规程操作计算机,集中精力调试程序,并认真测试实验数据。
对实验程序的故障应自行分析解决,不拷贝其它人的成果。
对实验得出的结果能加以分析,提出改进的具体措施。
掌握递归与分治策略、动态规划、贪心算法、回溯法、分支限界法等算法思想;能独立运用相关算法策略分析问题、解决实际问题并编程实现。
算法设计与分析实验指导书
实验一串匹配程序设计(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个学时。
算法分析与设计》实验指导与报告书
《算法分析与设计》实验指导与报告书实验目录实验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.基本掌握分治算法的原理.2.掌握递归算法及递归程序的设计.3.能用程序设计语言求解锦标赛等问题的算法.[预习要求]1.认真阅读数据结构教材和算法设计教材,了解分治算法原理;2.设计用分治算法求解背包问题的数据结构与程序代码.[实验题]【问题描述】设有n=2k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。
在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。
其中1≤i≤n,1≤j≤n-1。
[实验提示]我们可以按分治策略将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。
递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。
这时只要让这两个选手进行比赛就可以了。
1 2 3 4 5 6 71 2 3 4 5 6 7 82 1 43 6 7 8 53 4 1 2 7 8 5 61 2 3 4 3 2 1 8 5 6 71 2 3 4 5 6 7 8 1 4 3 21 2 1 4 3 6 5 8 7 2 1 4 31 2 3 4 1 2 7 8 5 6 3 2 1 42 1 43 2 1 8 7 6 54 3 2 1(1)(2)(3)图1 2个、4个和8个选手的比赛日程表图1所列出的正方形表(3)是8个选手的比赛日程表。
其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。
据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。
依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。
《算法设计与分析》实验指导书
《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。
《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。
本课程设计了7个设计型实验。
实验内容包括用分治法、动态规划、贪心法、回溯法以及分支限界法求解问题。
一、实验内容安排二、实验基本要求实验前要求学生一定要先了解实验目的、内容、要求以及注意事项,要求学生熟悉实验对象,设计并编写相应的算法。
学生应独立完成所布置实验内容,编写代码,运行程序,记录结果并撰写实验报告。
三、实验报告要求实验结束后,应及时整理出实验报告,实验报告提交书面文档。
四、考核方式理论考试(60%)+实验(30%)+作业(10%)五、实验内容与指导实验一快速排序问题1.实验目的(1) 用分治法求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n个无序的数值数据,现要求将其排列成一个有序的序列。
4. 实验步骤(1) 输入实现该问题的源代码;(2) 输入测试数据,验证代码的正确性。
5.实验要求(1)做好实验预习,熟悉本实验中所使用的开发环境。
(2)写出实验报告①实验目的②实验内容③出错信息及处理方法④实验结果实验二最少硬币问题1.实验目的(1) 用动态规划求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱;各面值的个数存在数组Num[1:n]中。
对于给定的1≤n≤10,硬币面值数组、各面值的个数及钱数m,0<=m<=2001,设计一个算法,计算找钱m的最少硬币数。
《算法设计与分析》课程实验报告 (算法问题求解基础1)
}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。
算法分析与设计实验指导书
《算法分析与设计》实验指导本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使用学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:1、准备好上机所需的程序,手编程序应书写整齐,并经人工检查无误后才能上机。
2、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
3、上机结束后,整理出实验报告。
实验报告应包括:题目,程序清单,运行结果,对运行情况所作的分析。
本书共分阶段4个实验,每个实验有基本题和提高题。
基本题必须完成,提高题根据自己实际情况进行取舍。
题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其它题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。
其具体内容如下:实验一分治与递归(4学时)基本题一:基本递归算法一一、实验目的与要求1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解;二、实验内容掌握递归算法的概念和基本思想,分析结果能够用递归方法实现整数的划分。
三、实验题:任意输入一个整数,输出结果能够用递归方法实现整数的划分。
四、四实验步骤1、理解算法思想和问题要求;2、编程实现题目要求;3、上机输入和调试自己所编写的程序;4、验证分析实验结果;5、整理实验报告。
基本题二:棋盘覆盖问题一、实验目的与要求1、掌握棋盘覆盖问题的算法;2、初步掌握分治算法。
二、实验题目棋盘覆盖问题在一个2k*2k方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一个特殊棋盘。
在棋盘覆盖问题中,要用图标4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
提高题一:二分搜索一、实验目的与要求1、熟悉二分搜索算法;2、初步掌握分治算法。
二、实验题1、高a【0:n-1】是一个已排好的数组。
算法设计与分析课程设计实习指导书--2018级-0705
《算法设计与分析课程设计》指导书《算法设计与分析课程设计》实习指导书一、课程设计目的本课程设计是在学生学习《算法设计与分析》课程后,进行的一次针对具体问题进行算法设计与分析的综合训练,其目的在于加深算法设计分析的理解,掌握算法分析设计方法。
二、算法设计与分析课程设计要求1.学生必须仔细阅读《算法设计与分析课程设计》实习方案,认真主动完成课设的要求。
有问题及时主动通过各种方式与教师联系沟通。
2.学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向教师汇报。
3.课程设计按照教学要求需要一周(5天)时间完成。
三、实验所用仪器及实验环境PC机,Codeblocks软件环境。
四、实习基本内容本次课程设计要求在(一)、(二)、(三)、(四)组中每组选择至少一个题目完成。
(一)分治策略1、输油管道问题【题目描述】某石油公司计划建造一条由西向东的主输油管道,该管道要穿过一个有n口油井的油田。
从每口油田都要有一条输油管道沿最短路径(或南或北)与主管道相连。
如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管长度总和最小的位置?【输入】第一行是一个整数n,表示油井数量(1-1000之间),接下来n行是油井的位置,每行两个整数x和y。
【输出】各油井到主管道之间的输油管道最小长度总和。
【输入样例】51 22 21 33 -23 3【输出样例】62、船的价值问题描述:大橙子最近在玩《艦これ》,因此大橙子收集了很多很多的船(这里我们假设大橙子氪了很多金,开了无数个船位)。
去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。
每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高。
Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的。
算法设计与分析实验指导书
《算法设计与分析》实验指导书实验一递归与分治1、实验目的(1)掌握设计有效算法的分治策略;(2)通过合并排序和快速排序两个示例学习分治策略设计技巧。
2、实验要求(1)熟练掌握分治法的基本思想及其应用实现;(2)理解所给出的算法,并对其加以改进。
3、实验内容(1)分治法基本思想如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
(2)分治法--算法设计模式如下:Divide-and-Conquer(P)1) if |P|≤n02) then return(ADHOC(P))3) 将P分解为较小的子问题P1 ,P2 ,...,Pk4) for i←1 to k5) 5. do yi ← Divide-and-Conquer(Pi) △递归解决Pi6) 6. T ← MERGE(y1,y2,...,yk)△合并子问题7) return(T)4、实验方法1)合并排序:将待排序元素分成个数大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合并成为所要求的排序集合。
2)快速排序:对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:①分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
②递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
③合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。
《算法分析与设计》实验指导书-推荐下载
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
《算法设计与分析》课程实验报告 (分治法(三))
《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。
2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。
设计算法求出A的一个近似中值。
如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。
二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。
三、实验要求(1)写清算法的设计思想。
(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。
(3)根据你的数据结构设计测试数据,并记录实验结果。
(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。
四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
《算法设计与分析》实验目的
《算法设计与分析》实验指导书曹严元计算机与信息科学学院2007年5月目录实验一递归算法与非递归算法 (2)实验二分治算法 ................................................... 错误!未定义书签。
实验三贪心算法 (3)实验四动态规划 (2)实验五回溯法 (3)实验六分枝—限界算法 (4)实验七课程设计 (4)实验一递归与分治算法实验目的1.了解并掌握递归的概念,掌握递归算法的基本思想;2.掌握分治法的基本思想方法;3.了解适用于用递归与分治求解的问题类型,并能设计相应递归与分治算法;4.掌握递归与分治算法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。
实验二动态规划实验目的1.掌握动态规划的基本思想方法;2.了解适用于用动态规划方法求解的问题类型,并能设计相应动态规划算法;3.掌握动态规划算法复杂性分析方法。
实验三贪心算法实验目的1.掌握贪心法的基本思想方法;2.了解适用于用贪心法求解的问题类型,并能设计相应贪心法算法;3.掌握贪心算法复杂性分析方法分析问题复杂性。
实验五回溯法实验目的1.掌握回溯法的基本思想方法;2.了解适用于用回溯法求解的问题类型,并能设计相应回溯法算法;3.掌握回溯法算法复杂性分析方法,分析问题复杂性。
实验六 分枝—限界算法实验目的1. 掌握分枝—限界的基本思想方法;2. 了解适用于用分枝—限界方法求解的问题类型,并能设计相应动态规划算法;3. 掌握分枝—限界算法复杂性分析方法,分析问题复杂性。
实验七 课程设计实验目的1. 在已学的算法基本设计方法的基础上,理解算法设计的基本思想方法;2. 掌握对写出的算法的复杂性分析的方法,理解算法效率的重要性;3. 能运用所学的基本算法设计方法对问题设计相应算法,分析其效率,并建立对算法进行改进,提高效率的思想意识。
预习与实验要求1. 预习实验指导书及教材的有关内容,回顾所学过的算法的基本思想;2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3. 认真听讲,服从安排,独立思考并完成实验。
《算法分析与设计》实验指导书
算法分析与设计本书是为配合《计算机算法分析与设计》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,增强算法分析与设计实践动手能力。
上机实验注意事项如下:(1)课前认真做好预习,准备好实验工具,熟悉实验流程和手段。
(3)课中根据实验指导书,结合课本实例进行编程实验。
实验时,一人一组,独立上机调试,上机时出现疑问,可以举手询问实验指导老师,或者与周边同学小声讨论,鼓励独立解决问题。
(4)课后按时按质按量整理出实验报告。
实验报告应独立完成,拒绝抄袭。
实验内容覆盖:递归与分治策略、动态规划、贪心算法、回溯法、分支限界法等。
实验一递归与分治策略一.实验目的与要求(1)理解和掌握递归与分治策略的基本原理。
(2)理解课本中的示例代码。
(3)调试代码通过。
二.递归与分治的基本思想(1)递归与分治方法。
递归与分治方法的基本思想是:将一个难以解决的大问题,分割成一些规模较小的、相同的子问题,以便各个击破,分而治之。
(2)递归。
递归问题分析时,要把握如下两个要素:●递归出口。
●递归公式。
其中:●递归出口给出了最简单情况下问题的解。
●递归公式则给出了一般意义下大问题(原问题)和小问题(子问题)之间的递归关系。
通过递归公式,一个难以解决的大问题会随着递归不断分解为多个小问题,小问题继续递归变为更小的小问题,直到最后到达递归出口得到解。
三.实验代码分析和说明本部分实验,需完成“棋盘覆盖”(课本P20)和“快速排序”(课本P22)两个问题。
3.1棋盘覆盖1. 棋盘覆盖问题的思路:(1)首先,将原始的棋盘覆盖问题看作最初的大问题。
(2)然后,将棋盘的行、列一分为二,从而将原始的大棋盘分为四个同样大小的小棋盘。
(3)接着,采用P21的图2-5中合适的L型骨牌,覆盖原始大棋盘的中心位置,将四个同样大小的小棋盘都转化为特殊棋盘。
(4)最后,对四个特殊小棋盘进行递归处理即可。
以上步骤(2)和步骤(3)合起来,完成了将大问题划分为小问题的过程,特别需要注意的是:小问题必须要和大问题相同或相似,否则无法递归。
算法设计与分析课程设计-实验指导书 -
算法设计与分析课程设计实验指导书一、运动员比赛日程表设有n=2k个运动员要进行网球比赛。
设计一个满足以下要求的比赛日程表:●每个选手必须与其它n-1个选手各赛一次●每个选手一天只能赛一次●循环赛一共进行n-1天1、运用分治策略,该问题的递归算法描述如下,根据算法编制程序并上机通过。
输入:运动员人数n(假定n恰好为2的i次方)输出:比赛日程表A[1..n,1..n]1. for i←1 to n //设置运动员编号2. A[i,1]←i3. end for4. Calendar(0,n) //位移为0,运动员人数为n。
过程Calendar(v, k) //v表示位移(v=起始行-1),k表示运动员人数。
1. if k=2 then //运动员人数为2个2. A[v+2,2]←A[v+1,1] //处理右下角3. A[v+1,2]←A[v+2,1]//处理右上角4. else5. Calendar(v,k/2) //假设已制定了v+1至v+k/2运动员循环赛日程表6. Calendar(v+k/2,k/2) //假设已制定了v+k/2+1至v+k运动员循环赛日程表7. comment:将2个k/2人组的解,组合成1个k人组的解。
8. for i←1 to k/29. for j←1 to k/210. A[v+i+k/2,j+k/2]←A[v+i,j] //沿对角线处理右下角11. end for12. end for13. for i←k/2+1 to k14. for j←1 to k/215. A[v+i-k/2,j+k/2]←A[v+i,j] //沿对角线处理右上角16. end for17. end for18. end if2、编制该问题的非递归算法,上机通过。
将如上文件保存在命名为“学号+姓名+实验一”的文件夹中并上传到指定的服务器。
二、最长公共子序列运用动态规划法最长公共子序列问题,给出最优值并输出最优解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法分析与设计》实验指导.实验一锦标赛问题[实验目的]1.基本掌握分治算法的原理.2.能用程序设计语言求解锦标赛等问题的算法;[预习要求]1.认真阅读数据结构教材和算法设计教材,了解分治算法原理;2.设计用分治算法求解背包问题的数据结构与程序代码.[实验题]【问题描述】设有n=2k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。
在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。
其中1≤i≤n,1≤j≤n-1。
[实验提示]我们可以按分治策略将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。
递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。
这时只要让这两个选手进行比赛就可以了。
1 2 3 4 5 6 71(1)(2)(3)图1 2个、4个和8个选手的比赛日程表图1所列出的正方形表(3)是8个选手的比赛日程表。
其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。
据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。
依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。
[实验步骤]1.设计并实现算法并准备测试用例,修改并调试程序,直至正确为止;2.应用设计的算法和程序求锦标赛问题;3.去掉测试程序,将你的程序整理成功能模块存盘备用.[实验报告要求]1.阐述实验目的和实验内容;2.阐述分治算法原理;3.提交实验程序的功能模块;4.记录最终测试数据和测试结果。
[思考与练习]【金块问题】老板有一袋金块(共n块,n是2的幂(n>=2)),将有两名最优秀的雇员每人得到其中的一块,排名第一的得到最重的那块,排名第二的雇员得到袋子中最轻的金块。
假设有一台比较重量的仪器,请用最少的比较次数找出最重和最轻的金块。
实验二背包问题[实验目的]3.能用程序设计语言实现求解背包问题的算法;4.基本掌握动态规划法(贪心)的原理方法.[预习要求]3.认真阅读数据结构教材和算法设计教材,了解背包问题的常用算法原理;4.设计用动态规划算法求解背包问题的数据结构和递归程序.[实验题]【背包问题】有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量W,但选中物品的价值之和最大。
[实验提示]设n件物品的重量分别为w0、w1、…、w n-1,物品的价值分别为v0、v1、…、v n-1。
采用递归寻找物品的选择方案。
设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。
当前正在考察新方案,其物品选择情况保存于数组cop[ ]。
假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。
算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。
因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。
对于第i件物品的选择考虑有两种可能:(1)考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。
选中后,继续递归去考虑其余物品的选择。
(2)考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。
按以上思想写出递归算法如下:try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv){ /*考虑物品i包含在当前方案中的可能性*/if(包含物品i是可以接受的){ 将物品i包含在当前方案中;if (i<n-1)try(i+1,tw+物品i的重量,tv);else/*又一个完整方案,因为它比前面的方案好,以它作为最佳方案*/以当前方案作为临时最佳方案保存;恢复物品i不包含状态;}/*考虑物品i 不包含在当前方案中的可能性*/ if (不包含物品i 仅是可男考虑的) if (i<n-1)try(i+1,tw,tv-物品i 的价值); else/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/以当前方案作为临时最佳方案保存;}并设限制重量为7。
则按以上算法,下图表示找解过程。
由图知,一旦找到一个解,算法就进一步找更好的佳。
如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。
[实验步骤]4.设计并实现算法并准备测试用例,修改并调试程序,直至正确为止; 5. 应用设计的算法和程序求解背包问题;6. 去掉测试程序,将你的程序整理成功能模块存盘备用.[实验报告要求]5.阐述实验目的和实验内容;6.阐述求解背包问题的算法原理;7.提交实验程序的功能模块;8.记录最终测试数据和测试结果。
[思考与练习]请用其它的算法(如贪心、分支限界等)求解背包问题。
实验三作业调度问题[实验目的]1.熟悉多机调度问题的算法;2.进一步掌握贪心算法3.提高分析与解决问题的能力。
[预习要求]1.认真阅读教材或参考书, 掌握贪心算法的基本思想;2.写出求解“作业调度”的程序;3.设计好测试用例。
[实验题]要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。
作业不能拆分成更小的子作业。
[实验提示]1.把作业按加工所用的时间从大到小排序;2.如果作业数目比机器的数目少或相等,则直接把作业分配下去;3 .如果作业数目比机器的数目多,则每台机器上先分配一个作业,如下的作业分配时,是选那个表头上s最小的链表加入新作业。
typedef struct Job{int ID;//作业号int time;//作业所花费的时间}Job;typedef struct JobNode //作业链表的节点{int ID;int time;JobNode *next;}JobNode,*pJobNode;typedef struct Header //链表的表头int s;pJobNode next;}Header,pHeader;int SelectMin(Header* M,int m){int k=0;for(int i=1;i<m;i++){if(M[i].s<m[k].s)k=i;}return k;}[实验步骤]1先用贪心算法求解该问题,并测试你的程序,直至正确为止;2针对问题实例,实录运行时的输入、输出文件;3将你的程序和实录的界面存盘备用。
[实验报告要求]阐述实验目的和实验内容;1提交模块化的实验程序源代码;2简述程序的测试过程,提交实录的输入、输出文件;3鼓励对实验内容展开讨论,鼓励提交思考与练习题的代码和测试结果。
实验四回溯算法设计[实验目的]1.掌握回溯法解题的基本思想;2.掌握回溯算法的设计方法;3.针对子集和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。
[预习要求]1.认真阅读教材或参考书, 掌握回溯法解题的基本思想, 算法的抽象控制策略;2.了解子集和数问题及解向量的定长和变长状态空间表示;3.针对解向量的定长表示, 设计状态空间树节点扩展的规范(限界)函数及实现方法;4.分析深度优先扩展状态空间树节点或回溯的条件;5.分析和设计生成解向量各分量可选值的实现方法;6.设计和编制回溯算法的递归和迭代程序。
[实验题]【组合数】找出从自然数1,2,…,n中任取r个数的所有组合。
[实验提示]回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。
当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。
如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。
在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。
扩大当前候选解的规模,以继续试探的过程称为向前试探。
可以采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:(1)a[i+1]>a[i],后一个数字比前一个大;(2)a[i]-i<=n-r+1。
按回溯法的思想,找解过程可以叙述如下:首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。
因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件(1),候选组合改为1,2。
继续这一过程,得到候选组合1,2,3。
该候选解满足包括问题规模在内的全部条件,因而是一个解。
在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。
由于对5不能再作调整,就要从a[2]回溯到a[1],这时,a[1]=2,可以调整为3,并向前试探,得到解1,3,4。
重复上述向前试探和向后回溯,直至要从a[0]再回溯时,说明已经找完问题的全部解。
按上述思想写成程序如下:void comb(int n,int r){ int i,j; i=0; a[i]=1;do { if (a[i]-i<=n-r+1)/*还可以向前试探*/{ if (i==r-1)/*已找到一个组合*/{ for (j=0;j<r;j++) printf(“%4d”,a[j]); printf(“\n”);a[i]++; continue;}i++;a[i] = a[i-1] + 1; /*向前试探*/} else { if (i==0) return;/*已找到所有解*/a[--i]++; } /*回溯*/}while (1);}[实验步骤]1.录入、修改并测试你的程序,直至正确为止;2.针对问题实例,实录运行时的输入、输出界面;3.将你的程序和实录的界面存盘备用。
[实验报告要求]1.阐述实验目的和实验内容;2.提交模块化的实验程序源代码;3.简述程序的测试过程,提交实录的输入、输出界面;4.鼓励对实验内容展开讨论,鼓励提交思考与练习题的代码和测试结果。