算法设计与分析课程设计报告样本
算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期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'; }}五.程序调试中的问题调试过程,页码出现报错。
算法设计与分析实验报告_3

实验一全排列、快速排序【实验目的】1.掌握全排列的递归算法。
2.了解快速排序的分治算法思想。
【实验原理】一、全排列全排列的生成算法就是对于给定的字符集, 用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。
任何n个字符集的排列都可以与1~n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法。
n个字符的全体排列之间存在一个确定的线性顺序关系。
所有的排列中除最后一个排列外, 都有一个后继;除第一个排列外, 都有一个前驱。
每个排列的后继都可以从它的前驱经过最少的变化而得到, 全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。
二、快速排序快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行, 以此达到整个数据变成有序序列。
【实验内容】1.全排列递归算法的实现。
2.快速排序分治算法的实现。
【实验结果】1.全排列:快速排序:实验二最长公共子序列、活动安排问题【实验目的】了解动态规划算法设计思想, 运用动态规划算法实现最长公共子序列问题。
了解贪心算法思想, 运用贪心算法设计思想实现活动安排问题。
【实验原理】一、动态规划法解最长公共子序列设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>, 则:..i.若xm=yn, 则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列...ii.若xm≠yn且zk≠x., 则Z是Xm-1和Y的最长公共子序列...iii.若xm≠yn且zk≠y.,则Z是X和Yn-1的最长公共子序列.其中Xm-1=<x1, x2, …, xm-1>, Yn-1=<y1, y2, …, yn-1>, Zk-1=<z1, z2, …, zk-1>。
算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。
为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。
二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。
1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。
(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。
- 对每种算法进行时间复杂度和空间复杂度的分析。
- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。
(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。
- 编写三种排序算法的代码。
- 分析代码的时间复杂度和空间复杂度。
- 编写测试程序,生成随机测试数据,测试三种算法的性能。
- 比较三种算法的运行时间和内存占用。
2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。
(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。
- 分析贪心算法的正确性,并证明其最优性。
(3)实验步骤:- 分析活动选择问题的贪心策略。
- 编写贪心算法的代码。
- 分析贪心算法的正确性,并证明其最优性。
- 编写测试程序,验证贪心算法的正确性。
3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。
(2)实验内容:- 实现一个动态规划算法问题,如背包问题。
- 分析动态规划算法的正确性,并证明其最优性。
(3)实验步骤:- 分析背包问题的动态规划策略。
- 编写动态规划算法的代码。
- 分析动态规划算法的正确性,并证明其最优性。
- 编写测试程序,验证动态规划算法的正确性。
三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。
算法设计与分析实验报告格式

《算法设计与分析》实验报告班级姓名学号2014年 11月 18日目录实验一二分查找程序实现………………………………………………………………01页实验二棋盘覆盖问题…………………………………………………………………04页实验三 0-1背包问题的动态规划算法设计……………………………………….07页实验四背包问题的贪心算法………………………………………………………10页指导教师对实验报告的评语成绩:指导教师签字:年月日实验一:二分查找程序的实现实验时间:2014年11月13日,星期四第三、四节,地点:J13#328二、实验目的及要求1)、实验目的:1. 掌握分治算法的基本思想(分—治—合)、技巧和效率分析方法。
2. 熟练掌握用递归设计分治算法的基本步骤。
3. 学会分治算法解决实际问题。
2)、实验要求:实现二分搜索的递归与非递归程序,并进行跟踪分析其执行过程,体会两者的执行效率。
三、实验环境Windows 2008C++四、实验内容实现二分搜索的递归与非递归程序,并进行跟踪分析其执行过程,体会两者的执行效率。
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。
如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x。
直到找到x,并返回x所在数组中的下标。
五、算法描述及实验步骤它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。
如果x>a[n/2],则我们只要在数组a的右半部继续搜索xint BinarySearch(int a[],int x,int n){//非递归方法int left=0;int right=n-1;while(left<=right){int middle=(left+right)/2;if (x==a[middle]) return middle;if (x>a[middle]) left=middle+1;else right=middle-1;}return -1;}//递归int BinSearch(int a[],int x,int low,int high){int mid;while(low<=high){mid=(low+high)/2;if(x==a[mid]) return mid;if(x<a[mid]) return(BinSearch(a,x,low,mid-1)); else return(BinSearch(a,x,mid+1,high));}return -1;}算法复杂性分析:容易看出,每执行一次算法的while循环,待搜索数组的大小减少一半。
《算法设计与分析》实验报告模板 (1)

《算法设计与分析》实验报告
学号:姓名:
实验一分治法求解众数问题
一、实验目的
1.掌握分治法的设计思想并能熟练应用;
2.理解分治与递归的关系。
二、实验题目
在一个序列中出现次数最多的元素称为众数,根据分治法的思想设计算法寻找众数。
三、实验程序
四、程序运行结果
实验二动态规划法求解单源最短路径问题
一、实验目的
1.深刻掌握动态规划法的设计思想;
2.熟练应用以上算法思想求解相关问题。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用动态规划法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验三贪心法求解单源点最短路径问题
一、实验目的
1.掌握贪心法的设计思想;
2.分析比较同一个问题采用不同算法设计思想求解的结果。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用贪心法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验四回溯法求解0/1背包问题
一、实验目的
1.掌握回溯法的设计思想;
2.掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
二、实验题目
给定n种物品和一个容量为C的背包,选择若干种物品(物品不可分割),使得装入背包中物品的总价值最大。
采用回溯法求解该问题。
三、实验程序
四、程序运行结果。
算法分析与设计-课程设计报告

XXXX大学算法设计与分析课程设计报告院(系):年级:姓名:专业:计算机科学与技术研究方向:互联网与网络技术指导教师:X X X X 大学目录题目1 电梯调度 (1)1.1 题目描述 (1)1。
2 算法文字描述 (1)1。
3 算法程序流程 (4)1.4 算法的程序实现代码 (8)题目2 切割木材 (10)2.1题目描述 (10)2。
2算法文字描述 (10)2.3算法程序流程 (11)2.4算法的程序实现代码 (15)题目3 设计题 (17)3.1题目描述 (17)3.2 输入要求 (17)3.3输出要求 (17)3.4样例输入 (17)3.5样例输出 (17)3.6测试样例输入 (17)3。
7测试样例输出 (18)3。
8算法实现的文字描述 (18)3。
9算法程序流程 (19)3.10算法的程序实现代码 (20)算法分析与设计课程总结 (23)参考文献 (24)题目1 电梯调度1。
1 题目描述一栋高达31层的写字楼只有一部电梯,其中电梯每走一层需花费4秒,并且在每一层楼停靠的时间为10秒,乘客上下一楼需要20秒,在此求解最后一位乘客到达目的楼层的最短时间以及具体的停靠计划.例如:此刻电梯停靠需求为4 5 10(有三位乘客,他们分别想去4楼、5楼和10楼),如果在每一层楼都停靠则三位乘客到达办公室所需要的时间为3*4=12秒、4*4+10=26秒、4*9+2*10=56秒,则最后一位乘客到达办公室的时间为56秒,相应的停靠计划为4 5 10均停靠。
对于此测试用例电梯停靠计划方案:4 10,这样到第4楼的乘客所需时间为3*4=12秒,到第5楼的乘客所需时间为3*4+20=32秒,到第10楼的乘客所需时间为9*4+10=46秒,即最后到达目的楼层的顾客所需时间为46秒.输入要求:输入的第1行为整数n f1 f2 … fn,其中n表示有n层楼需要停靠,n=0表示没有更多的测试用例,程序终止运行。
f1 f2 … fn表示需要停靠的楼层(n 〈=30,2<=f1<f2…fn<=31),每一个数字都用一个空格隔开.输出要求:对于每一个测试用例,第1行输出最后一位乘客到达目的楼层所需时间,第2行输出停靠次数和相应的停靠方案,每一个数字用一个空格隔开。
《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目1.N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后,任何两个皇后不放在同一行同一列,同一斜线上,问有多少种放法。
2.主元素问题问题描述:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。
给出一个算法,判断A中是否存在主元素。
二、实验目的(1)通过N后问题的实现,体会拉斯维加斯随机算法的随机特点:运行次数随机但有界,找到的解一定为正确解。
但某次运行可能找不到解。
(2)通过实现主元素的不同算法,了解蒙特卡罗算法的随机特性:对于偏真的蒙特卡罗算法,找到为真的解一定是正确解;但非真的解以高概率给出解的正确率------即算法找到的非真解以小概率出现错误。
同时体会确定性算法与随机化算法的差异及各自的优缺点。
(3)通过跳跃表的实现,体会算法设计的运用的广泛性,算法设计的思想及技巧不拘泥独立问题的解决,而在任何需要计算机解决的问题中,都能通过算法设计的技巧(无论是确定性还是随机化算法)来灵巧地解决问题。
此实验表明,通过算法设计技巧与数据组织的有机结合,能够设计出高效的数据结构。
三、实验要求(1)N后问题分别以纯拉斯维加斯算法及拉斯维加斯算法+回溯法混合实现。
要求对同一组测试数据,完成如下任务a.输出纯拉斯维加斯算法找到解的运行次数及运行时间。
b.输出混合算法的stopVegas值及运行时间c.比较a、b的结果并分析N后问题的适用情况。
(2)主元素问题,要求对同一组测试数据,完成如下任务:a.若元素可以比较大小,请实现O(n )的确定性算法,并输出其运行时间。
b.(选做题)若元素不可以比较大小,只能比较相同否,请实现O(n) 确性算法,并输出其运行时间。
c.实现蒙特卡罗算法,并输出其运行次数及时间。
d.比较确定性算法与蒙特卡罗算法的性能,分析每种方法的优缺点。
(3)参照教材实现跳跃表(有序)及基本操作:插入一个结点,删除一个结点。
《算法设计与分析》课程实验报告 (算法问题求解基础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。
算法设计与分析实验报告_2

课程设计报告题目:计算机算法基础实验报告课程名称:专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录一、实验目的 (3)二、实验题目 (3)三、设计分析 (3)1.生成最短路径问题设计分析 (3)2.最优二分检索树问题设计分析 (4)四、算法描述 (5)1.生成最短路径问题算法描述(用流程图表示) (5)2.最优二分检索树问题算法描述(用流程图表示) (6)五、程序 (7)1. 生成最短路径问题算法代码 (7)2.最优二叉检索树源代码 (10)六、测试与分析 (13)1.生成最短路径问题算法 (13)2.最优二叉检索树源测试及分析 (15)七、实验总结及体会 (16)八、参考书目 (17)一、实验目的1.掌握贪心方法、动态规划的基本思想2.了解适用贪心方法、动态规划的问题类型,并能设计相应的贪心法算法3.掌握贪心算法、动态规划算法时间空间复杂度分析,以及问题复杂性分析方法二、实验题目1.实现单源点生成最短路径的贪心方法,完善算法,求出长度,并推导路径上的结点序列2.实现最优二分检索树算法,计算各C(i,j)、R(i,j)、W(i,j)的值,并推导树的形态三、设计分析1.生成最短路径问题设计分析为了制定产生最短路径贪心算法,对于这个问题需要想出一个多级解决方案和最优的量度标准。
方法之一是逐条构造这些最短路径,可以用迄今已经生成的所有路径长度之和作为一种量度,为了使这一量度达到最小,其单独的每一个路径都必须具有最小长度。
使用这一个量度标准时,假定已经构造了i条最短路径,则下面要构造的路径应该是下一个最小的长度路径。
生成从源点v0到所有其他结点的最短路径的贪心方法就是按照路径长度的非降次序生成这些路径。
首先,生成一条到最短结点的最短路径,然后生成一条到第二近结点的最短路径,依次往下进行…。
为了按照这样的路径生成这些最短路径,需要确定与其生成最短路径的下一个结点,以及到这一结点的最短路径。
算法设计与分析课程设计报告简单示例 (1)

算法设计与分析课程设计题目:模拟实现稳定婚姻问题的Gale-Shapley算法设计分析测试报告姓名:郑展图学号:3100608010班级:软件1001指导教师:蒋丽萍2013年1 月9 日程序算法设计说明书一、前言1.问题描述:稳定婚姻问题:有n男n女,每人都按他对(异性)对象的喜好程度按1至n排列。
安排男女结婚,使得下列情形为真:在n 男n女中的任意两对夫妇(M, W)和(m, w),都不存在M男对w女喜好度大于现任妻子W女,并且w女对M男喜好度也大于现任丈夫m男的情形发生,此种情形称为不稳定。
2.程序编制环境相关说明:系统:WINDOWS 7编制环境:visual studio 8二、程序主要算法设计分析说明算法设计思路:在N对男女中,男生采用主动出击追求自己最喜欢的女生策略,女生采用“守株待兔”和“喜新厌旧”策略。
每一位男生主动去追求自己最喜欢的女生,而女生则在追求自己的男生中与现任男友中,选择一位最喜欢的接受。
如果追求成功,为被抛弃的男友追求他下一位喜欢的女生。
如果追求不成功,则为这位男生追求他下一位喜欢的女生。
这样进行了N次循环后,每一位男生都是从自己最喜欢的女生开始追求,并且都有女友,那么男生喜欢的程度多于现任妻子的那位女生肯定是曾经拒绝过自己的。
同理,女生也是按照自己喜欢程度进行选择的。
那么也不会出现不稳定问题。
三、程序模块说明1.总体设计说明:程序采用两个二维数组man[max][max],woman[max][max]来记录max位男生,女生对异性的喜欢程度顺序。
数组acman[]记录男生下一位追求的女生顺序(最开始从0位,也就是最喜欢的一位开始);数组acwoman[]记录每一位女生当前男友(最开始设置一位虚拟男友,其喜欢程度最小)采用4个for循环,分别对4个数组初始化。
采用一个for循环遍历man数组(为每一位男生追求其最喜欢的女生)采用一个for循环输出结果2.模块说明:2.1模块一:bool changeBF(vector<vector<int> > woman,int i,intnewBF,int oldBF,int max)函数(1)概要说明:判断某位女生的当前男友与追求她的男友的排位顺序(喜欢程度)(2)关键数据结构和算法及其分析(比较newBF和oldBF在数组woman[][max]的序号大小,从而判断喜欢程度)(3)输入(数组woman[][])(4)输出(bool类型1,0)四、总结(含主函数设计说明)这次课程设计的题目有点复杂,一开始看到这个题目时,还不知道要怎么下手解决。
算法设计与分析实验报告

实验课程名称:算法设计与分析这里的数据包括1到100的所有数字,55在这个序列中。
2.当没找到所要寻找的数字时,输出该数据并不存在于数据库中:0并不存在于这个序列中。
一、时间复杂性分析:1.最好情况下:这里的最好情况,即为第一次查找就找到了要找的数据,故时间复杂性为O (1)。
2.最坏情况下:这里的最坏情况意味着要将所有数据都找一遍最后才能找到要查找的数据,随着数据库的增大,查找次数会随之增长,故其时间复杂度为O (n )。
3.平均情况下:这种情况考虑了数据时等概率的分布于数据库中。
ASL=-101-121111=2=(1*2+2*2+...+*2)log (+1)-1nkj k i i i j p c j k n nn==≈∑∑折半查找的时间复杂性为O (2log n )。
二、空间复杂度分析:这里查找的过程中并不需要额外的空间,只需要存放数据的空间,故空间复杂度为O (n ),n 为数组的大小。
三、算法功能:其功能主要是用来查找数据,若对它进行一下拓展,可以由自主确定数据库,并可对他进行操作;这里的数据也可以不只是包括整数。
实验二结果:1.当数组的容量不大于0时,显示错误:2.当输入数据错误时,显示错误:3.当输入正确时的显示结果:一、时间复杂性分析:1.最好情况下:T (n )≤2 T (n /2)+n ≤2(2T (n /4)+n /2)+n =4T (n /4)+2n ≤4(2T (n /8)+n /4)+2n =8T (n /8)+3n … … …≤nT (1)+n log 2n =O (n log 2n ) 因此,时间复杂度为O (n log 2n )。
2.最坏情况下:待排序记录序列正序或逆序,每次划分只得到一个比上一次划分少一个记录的子序列(另一个子序列为空)。
此时,必须经过n -1次递归调用才能把所有记录定位,而且第i 趟划分需要经过n -i 次关键码的比较才能找到第i 个记录的基准位置,因此,总的比较次数为: 因此,时间复杂度为O (n 2)。
算法分析与设计课设

成绩评定表课程设计任务书摘要为了满足人们对大数据量信息处理的渴望,为解决各种实际问题,计算机算法学得到了飞速的发展,线性规划、动态规划、贪心策略等一系列运筹学模型纷纷运用到计算机算法学中,产生了解决各种现实问题的有效算法。
虽然设计一个好的求解算法更像是一门艺术而不像是技术 ,但仍然存在一些行之有效的、能够用于解决许多问题的算法设计方法 ,你可以使用这些方法来设计算法 ,并观察这些算法是如何工作的。
一般情况下,为了获得较好的性能,必须对算法进行细致的调整。
但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。
动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。
但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响,因为有些子问题可能要重复计算多次,所以利用动态规划使这些子问题只计算一次。
回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有可行的子树都已被搜索遍才结束。
而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。
这就是以深度优先的方式系统地搜索问题解的回溯算法,它适用于解决一些类似n皇后问题等求解方案问题,也可以解决一些最优化问题。
在做题时,有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。
回溯法的优点在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。
关键词:算法;动态规划;回溯法;目录一、问题描述 (1)1.1k乘积问题 (1)1.2最小重量机器问题 (1)二、算法设计 (1)三、设计原理 (2)3.1动态规划 (2)3.2回溯法 (2)四、问题分析与设计 (3)4.1k乘积问题 (3)4.2最小重量机器设计问题 (4)五、算法实现 (4)5.1k乘积问题 (4)5.2最小重量机器问题 (7)六、结果分析 (10)总结 (11)参考文献 (12)一、问题描述1.1k乘积问题设I是一个n位十进制整数。
算法分析教(学)案设计实验报告

!
****
{
·
院系:计算机科学学院
专业:计算机科学与技术
年级:
课程名称:算法设计与分析基础
班号:
组号:
[
指导教师:
年月日
@
else
FakeCoin_1(coin,n,l,l+ps-1);
}
}
[
void FakeCoin()
{
int i=1,n, coin[100];
printf("请输入硬币的个数: ");
scanf("%d",&n);
printf("请输入硬币的重量:\n");
for(i=1;i<=n;i++)
{
{
scanf("%d",&coin[i]);
}
FakeCoin_1(coin,n,1,n);
}
实
验
结
¥
果
及
分
析通过这个实验,理解并掌握了减治法的设计思想并理解了它与分治法的区别。
在写这个算法前,一定要建立正确的求解模型。
实
验
)
结
果
及
分
析
经过这次实验,理解了变治法的设计思想,同时还掌握了堆的概念以及如何用变治法把任意给定的一组数据改变成堆。
算法设计实验报告模板

华南农业大学实验报告实验项目名称:问题求解与程序设计——以ACM网上题库选题所属课程名称:算法分析与设计开设时间:2009学年第二学期授课学生:08计算机科学与技术1-5班授课人数:155人指导教师:杨秋妹华南农业大学信息学院综合性、设计性实验成绩单教师签名:杨秋妹解题报告:Phone numbers题目来源: No.1039解法或类型:枚举作者:PipeTime Limit:1S Memory Limit:1000KTotal Submit:124 Accepted:36DescriptionThe GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape the company ran into the problem of determining how far the light can reach inside each component of the pipe. Note that the material which the pipe is made from is not transparent and not light reflecting.Each pipe component consists of many straight pipes connected tightly together. For the programming purposes, the company developed the description of each component as a sequence of points [x1; y1], [x2; y2], . . ., [xn; yn], where x1 < x2< . . . xn . These are the upper points of the pipe contour. The bottom points of the pipe contour consist of points with y-coordinate decreased by 1. To each upper point [xi; yi] there is a corresponding bottom point [xi; (yi)-1] (see picture above). The company wants to find, for each pipe component, the point with maximalx-coordinate that the light will reach. The light is emitted by a segment source with endpoints [x1; (y1)-1] and [x1; y1] (endpoints are emitting light too). Assume that the light is not bent at the pipe bent points and the bent points do not stop the light beam. InputThe input file contains several blocks each describing one pipe component. Each block starts with the number of bent points 2 <= n <= 20 on separate line. Each of the next n lines contains a pair of real values xi, yi separated by space. The last block is denoted with n = 0.OutputThe output file contains lines corresponding to blocks in input file. To each block in the input file there is one line in the output file. Each such line contains either a real value, written with precision of two decimal places, or the message Through all the pipe.. The real value is the desired maximal x-coordinate of the point where the light can reach from the source for corresponding pipe component. If this value equals to xn, then the message Through all the pipe. will appear in the output file.Sample Input40 12 24 16 460 12 -0.65 -4.457 -5.5712 -10.817 -16.55Sample Output4.67Through all the pipe.SourceCentral Europe 1995一、题目要求题目要我们求出光线在Pipe里能射到的最远处的x坐标。
算法设计与分析课程设计报告

湖南理工学院课程论文论文题目 0-1背包问题的设计与实现课程名称数据结构与算法设计姓名学号专业班级年级 2014级学院计算机学院日期 2015年6月25日课程论文评价标准目录1.问题描述 (3)2.算法设计分析 (3)3.程序编码与调试分析 (5)4.测试结果 (7)5.自学知识 (7)6.课程设计心得体会 (8)7.参考文献 (8)1.问题描述给定n种物品和一个背包,物品i的重量是w i,其价值为v i,背包容量为C。
在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或不装入背包,即不能将物品i装入背包多次,也不能只装入物品i的一部分。
问:如何选择装入背包的物品,使得装入背包中物品的总价值最大?2.算法设计与分析算法分析在0-1背包问题中,物体被装入一个背包,或者不被装入背包,设x i表示物品i装入背包的情况,则当x i=0时,表示物品i没有被装入背包,x i=1时,表示物品i被装入背包。
假设有五个物品,其重量分别是{2,2,6,5,4},价值分别是{6,3,5,4,6},背包的容量为10。
根据动态规划函数,用一个(n+1)×(C+1)的二维表V,V[i][j]表示把前i个物品装入容量为j的背包中获得的最大价值。
按下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;依此类推,直到第n个阶段。
最后,V(n,C)便是在容量为C的背包中装入n个物品时取得的最大价值。
为了确定装入背包的具体物品,从V(n,C)的值向前推,如果V(n,C)>V(n-1, C),表明第n个物品被装入背包,前n-1个物品被装入容量为C-w的背包中;n否则,第n个物品没有被装入背包,前n-1个物品被装入容量为C的背包中。
依此类推,直到确定第1个物品是否被装入背包中为止。
算法设计设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C,数组V [n+1][C+1]存放迭代结果,其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:int KnapSack(int n, int w[ ], int v[ ]){for (i=0; i<=n; i++) //初始化第0列V[i][0]=0;for (j=0; j<=C; j++) //初始化第0行V[0][j]=0;for (i=1; i<=n; i++) //计算第i行,进行第i次迭代for (j=1; j<=C; j++)if (j<w[i]) V[i][j]=V[i-1][j];else V[i][j]=max(V[i-1][j], V[i-1][j-w[i]]+v[i]);j=C; //求装入背包的物品for (i=n; i>0; i--){if (V[i][j]>V[i-1][j]) {x[i]=1;j=j-w[i];}else x[i]=0;}return V[n][C]; //返回背包取得的最大价值}3.程序编码与调试分析程序编码#include<stdio.h>#include<math.h>int max(int x,int y){if(x>=y)return x;elsereturn y;}int KnapSack(int n,int C,int *w,int *v,int V[][11]) {int i,j,x[i];for (i=0;i<=n;i++) //初始化第0列V[i][0]=0;for (j=0;j<=C;j++) //初始化第0行V[0][j]=0;for (i=1;i<=n;i++) //计算第i行,进行第i次迭代for (j=1;j<=C;j++)if (j<w[i])V[i][j]=V[i-1][j];elseV[i][j]=max(V[i-1][j], V[i-1][j-w[i]]+v[i]);j=C; //求装入背包的物品for (i=n; i>0; i--){if (V[i][j]>V[i-1][j]) {x[i]=1;j=j-w[i];}else x[i]=0;}for(i=0;i<=n;i++){for(j=0;j<=C;j++)printf("%3d ",V[i][j]);printf("\n");}printf("背包取得的最大价值:");printf("%d",V[n][C]); //返回背包取得的最大价值}int main(){int n=5,C=10,i;int V[6][11];int w[6],v[6];for(i=1;i<6;i++)scanf("%d",&w[i]);for(i=1;i<6;i++)scanf("%d",&v[i]);KnapSack(5,10,w,v,V);}调试分析以上0-1背包问题的代码的时间复杂度为O(nc).(n表示物品的总数,c为重量限制背包容量),当背包容量c很大时,算法需要的计算时间比较多。
算法设计与分析课程设计报告

算法设计与分析课程设计报告(总16页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--课程设计报告课程设计名称:算法设计与分析系:三系学生姓名:吴阳班级: 12软件(2)班学号: 232成绩:指导教师:秦川开课时间: 2014 学年一学期一、问题描述1.普通背包问题给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品,使得装入背包中的物品的总价值最大,在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
2.0/1背包问题给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品,使得装入背包中的物品的总价值最大,在选择物品i装入背包时,对于每种物品i只有两种选择,即装入背包或者不装入背包,不能将物品装入背包多次,也不能只装入部分的物品i。
3.棋盘覆盖问题在一个2k x 2k个方格组成的棋盘中恰有一个方格与其他的不同称为特殊方格,想要求利用四种L型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖。
二、问题分析1.普通背包问题对于背包问题,若它的一个最优解包含物品j,则从该最优解中拿出所含的物品j的那部分重量W,剩余的将是n-1个原重物品1,2,······,j-1,j+1,·····,n以及重为Wi-W的物品j中可装入容量为C-W的背包且具有最大价值的物品。
2.0/1背包问题如果当前背包中的物品的总容量是cw ,前面的k-1件物品都已经决定好是否要放入包中,那么第k 件物品是否放入包中取决于不等式 cw + wk <= M (其中,wk 为第k 件物品的容量,M 为背包的容量)(此即约束条件)然后我们再寻找限界函数,这个问题比较麻烦,我们可以回忆一下背包问题的贪心算法,即物品按照 物品的价值/物品的体积 来从大到小排列,然后最优解为(1,1,1.......,1,t ,0,0,......),其中0<=t<=1;因此,我们在确定第k 个物品到底要不要放入的时候(在前k-1个物品已经确定的情况下),我们可以考虑我们能够达到的最大的价值,即我们可以通过计算只放入一部分的k 物品来计算最大的价值。
算法设计与分析课程设计报告

算法与分析课程设计报告题目:算法设计和分析专业:网络工程班级:1020552学号:11姓名:赫前进太原工业学院计算机工程系2012年11月24 日第二章主元素问题一、算法问题描述主元素问题: 设T[0..n-1]是n个元素的数组。
对任一元素x,设S(x)={i|T[i]=x}。
当|S(x)|>n/2时,称x为T的主元素。
如果T中元素存在序关系,按分治策略设计并实现一个线性时间算法,确定T[0..n-1]是否有一个主元素。
二、算法问题形式化表示若T 中存在主元素,则将T 分为两部分后,T 的主元素也必为两部分中至少一部分的主元素,因此可用分治法。
将元素划分为两部分,递归地检查两部分有无主元素。
算法如下:若T 只含一个元素,则此元素就是主元素,返回此数。
将T 分为两部分T1 和T2(二者元素个数相等或只差一个),分别递归调用此方法求其主元素m1 和m2。
若m1 和m2 都存在且相等,则这个数就是T 的主元素,返回此数。
若m1 和m2 都存在且不等,则分别检查这两个数是否为T 的主元素,若有则返回此数,若无则返回空值。
若m1 和m2 只有一个存在,则检查这个数是否为T 的主元素,若是则返回此数,若否就返回空值。
若m1 和m2 都不存在,则T 无主元素,返回空值。
三、期望输入与输出输入:数组中元素的个数9数组元素0 0 1 1 0 8 1 1 1输出:显示主元素是1。
四、算法分析与步骤描述选择一个元素作为划分起点,然后用快速排序的方法将小于它的移动到左边,大于它的移动到右边。
这样就将元素划分为两个部分。
此时,划分元素所在位置为k。
如果k>n/2,那么继续用同样的方法在左边部分找;如果k<n/2就在右边部分找;k=n/2就找到了中位元素。
根据快速排序的思想,可以在平均时间复杂度为O(n)的时间内找出一个数列的中位数。
然后再用O(n)的时间检查它是否是主元素。
五、问题实例及算法运算步骤首先运行程序,按照提示输入数据;其次求出在数组T[0:n]中出现次数最多的元素x出现的次数k;然后用select方法线性时间选择,找到第(n+1)/2大的数;用QuickSort进行快速排序;用Partition方法进行数组划分,用swap将小于x的元素移到x左边,大于x的元素移到x右边;然后就可以得到时候存在主元素,输出到屏幕上。
算法与分析实验报告模板

算法与分析实验报告模板贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告课程名称:算法设计与分析班级:姓名:实验序号:一学号:实验日期:YYYY-MM-DD 指导教师:程欣宇实验成绩:一、实验名称分治算法实验 - 棋盘覆盖问题二、实验目的及要求 1、熟悉递归算法编写; 2、理解分治算法的特点; 3、掌握分治算法的基本结构。
三、实验环境 Visual C++ 四、实验内容根据教材上分析的棋盘覆盖问题的求解思路,进行验证性实验;要求完成棋盘覆盖问题的输入、分治求解、输出。
有余力的同学尝试消去递归求解。
五、算法描述及实验步骤分治算法原理:分治算法将大的分解成形状结构相同的子问题,并且不断递归地分解,直到子问题规模小到可以直接求解。
棋盘覆盖问题描述:在一个2k x 2k个方格组成的棋盘中恰有一个方格与其他的不同称为特殊方格,想要求利用四种L型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖。
实验步骤: 1、定义用于输入和输出的数据结构; 2、完成分治算法的编写; 3、测试记录结构; 4、有余力的同学尝试不改变输入输出结构,将递归消除,并说明能否不用栈,直接消除递归,为什么?六、调试过程及实验结果详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果。
七、总结对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。
八、附录源程序(核心代码)清单或使用说明书,可另附纸贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告课程名称:算法设计与分析班级:姓名:实验序号:二学号:实验日期:2021-11-25 指导教师:程欣宇实验成绩:一、实验名称动态规划实验 - 滑雪问题二、实验目的及要求 1、学会使用在线测评的算法题目评分系统; 2、通过直观的应用问题,加深对动态规划算法的理解;三、实验环境任意C或C++编写调试工具,北京大学ICPC在线测评系统POJ 四、实验内容 1、找到题号为1088的题目-滑雪,阅读题目,建立其最优解的递归表达式; 3、使用备忘录式的动态规划算法,实现本题; 4、进行简单测试,完成之后提交到POJ系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计名称: 算法设计与分析
系 : 三系
学生姓名: 吴阳
班级: 12软件(2)班
学号: 0311232
成绩:
指导教师: 秦川
开课时间: 年一学期
一、问题描述
1.普通背包问题
给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 能够选择物品i的一部分, 而不一定要全部装入背包, 1≤i≤n。
2.0/1背包问题
给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 对于每种物品i只有两种选择, 即装入背包或者不装入背包, 不能将物品装入背包多次, 也不能只装入部分的物品i。
3.棋盘覆盖问题
在一个2k x 2k个方格组成的棋盘中恰有一个方格与其它的不同称为特殊方格, 想要求利用四种L型骨牌( 每个骨牌可覆盖三个方格) 不相互重叠覆盖的将除了特殊方格外的其它方格覆盖。
二、问题分析
1.普通背包问题
对于背包问题, 若它的一个最优解包含物品j, 则从该最优解中拿出所含的物品j的那部分重量W, 剩余的将是n-1个原重物品1, 2, ······, j-1, j+1, ·····, n以及重为Wi-W的物品j 中可装入容量为C-W的背包且具有最大价值的物品。
2.0/1背包问题
如果当前背包中的物品的总容量是cw, 前面的k-1件物品都已经决定好是否要放入包中, 那么第k件物品是否放入包中取决于不等式 cw + wk <= M (其中, wk为第k件物品的容量, M为背包的容量)( 此即约束条件)
然后我们再寻找限界函数, 这个问题比较麻烦, 我们能够回忆一下背包问题的贪心算法, 即物品按照物品的价值/物品的体积来从大到小排列, 然后最优解为( 1, 1, 1......., 1, t, 0, 0, ......) , 其中0<=t<=1;
因此, 我们在确定第k个物品到底要不要放入的时候(在前k-1个物品已经确定的情况下), 我们能够考虑我们能够达到的最大的价值, 即我们能够经过计算只放入一部分的k物品来计算最大的价值。
我们要确保当前选择的路径的最大的价值要大于我们已经选择的路径的价值。
这就是该问题的限界条件。
经过该条件, 能够减去很多的枝条, 大大节省运行时间。
3.棋盘覆盖问题
每次都对分割后的四个小方块进行判断, 判断特殊方格是否
在里面。
这里的判断的方法是每次先记录下整个大方块的左上角方格的行列坐标, 然后再与特殊方格坐标进行比较, 就能够知道特殊方格是否在该块中。
如果特殊方块在里面, 这直接递归下去求即可, 如果不在, 这根据分割的四个方块的不同位置, 把右下角、 左下角、 右上角或者左上角的方格标记为特殊方块, 然后继续递归。
在递归函数里, 还要有一个变量s 来记录边的方格数, 每次对方块进行划分时, 边的方格数都会减半, 这个变量是为了方便判断特殊方格的位置。
其次还要有一个变nCount 来记录L 型骨牌的数量。
三、 建立数学模型
1.普通背包问题
普通背包问题的数学描述为: 在选择物品i 装入背包时, 能够选择物品i 的一部分, 而不一定要全部装入背包, 1≤i ≤n 。
C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n
i wixi 1≤C,
而且∑=n
xi 1i vi 达到最大。
2.0/1背包问题
0-1背包问题的数学描述为: 不能将物品装入背包多次, 也不能只装入部分的物品i 。
C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n i wixi 1≤C,而且∑=n
xi 1i vi 达到最大。
3.棋盘覆盖问题
当k>0时, 将2k×2k棋盘分割为4个2^k-1×2^k-1 子棋盘(a)所示。
特殊方格必位于4个较小子棋盘之一中, 其余3个子棋盘中无特殊方格。
为了将这3个无特殊方格的子棋盘转化为特殊棋盘, 能够用一个L型骨牌覆盖这3个较小棋盘的会合处, 如 (b)所示, 从而将原问题转化为4个较小规模的棋盘覆盖问题。
递归地使用这种分割, 直至棋盘简化为棋盘1×1。
四、算法设计
1.普通背包问题
因为每一个物品都能够分割成单位块, 单位块的利益越大显
然总收益越大, 因此它局部最优满足全局最优, 能够用贪心法解决。
算法设计: 首先计算每种物品单位重量的价值Vi/Wi, 然后按单位重量价值从大到小进行排序, 根据贪心选择策略, 将尽可能多的
单位重量价值最高的物品装入背包。
或将这种物品全部装入背包后,
背包内的物品总重量未超过背包容量C, 则选择单位重量价值次高的物品并尽可能多地装入背包, 依此策略一直进行下去, 直到背包装满为止。
2.0/1背包问题
该0-1背包问题采用的是回溯算法, 回溯算法的基本解题步骤是:
( 1) 针对所给问题定义问题的解空间;
( 2) 确定易于搜索的解空间结构;
( 3) 以深度优先方式搜索解空间, 并在搜索过程中用剪枝函数避免无效的搜索。
算法设计:
a.物品有n种, 背包容量为C, 分别用p[i]和w[i]存储第i 种物品的价值和重量, 用
x[i]标记第i种物品是否装入背包, 用bestx[i]存储第i种物品的最优装载方案;
b. 用递归函数Backtrack (i,cp,cw)来实现回溯法搜索子集树( 形式参数i表示递归深
度, n用来控制递归深度, 形式参数cp和cw表示当前总价值和总重量, bestp表示当前
最优总价值) :
①若i >n, 则算法搜索到一个叶结点, 判断当前总价值是否最优:。