算法设计实验报告1_V2版

合集下载

算法设计_实验报告

算法设计_实验报告

通过本次实验,加深对算法设计方法的理解,掌握常用算法的原理和实现方法,提高编程能力。

二、实验内容1. 矩阵链乘问题2. 投资问题3. 完全背包问题4. 数字三角形问题5. 最小生成树问题三、实验原理1. 矩阵链乘问题矩阵链乘问题是指给定一系列矩阵,求这些矩阵连乘的乘积的最小计算代价。

动态规划方法可以有效地解决这个问题。

2. 投资问题投资问题是指给定一组投资方案和初始资金,求在有限的时间内,如何选择投资方案使得最终收益最大。

动态规划方法可以解决这个问题。

3. 完全背包问题完全背包问题是指给定一组物品和背包的容量,求在不超过背包容量的前提下,如何选择物品使得背包中物品的总价值最大。

动态规划方法可以解决这个问题。

4. 数字三角形问题数字三角形问题是指给定一个数字三角形,从顶部到底部求出一条路径,使得路径上的数字之和最大。

动态规划方法可以解决这个问题。

5. 最小生成树问题最小生成树问题是指给定一个加权无向图,求一个包含图中所有顶点的最小生成树。

Prim算法和Kruskal算法是解决此问题的常用算法。

1. 矩阵链乘问题(1)定义一个二维数组dp,dp[i][j]表示从矩阵A[i]到矩阵A[j]的最小计算代价。

(2)初始化dp[i][i]为0,表示单个矩阵的计算代价为0。

(3)对于长度为2的矩阵链,dp[i][i+1]等于矩阵A[i]和A[i+1]的乘积。

(4)对于长度大于2的矩阵链,通过遍历所有可能的分割点,计算dp[i][j]的最小值。

2. 投资问题(1)定义一个二维数组dp,dp[i][j]表示在前i个投资方案中,使用j元资金所能获得的最大收益。

(2)初始化dp[0][0]为0,表示不投资时收益为0。

(3)对于第i个投资方案,遍历所有可能的资金使用情况,更新dp[i][j]的值。

3. 完全背包问题(1)定义一个二维数组dp,dp[i][j]表示在前i个物品中,使用容量为j的背包所能获得的最大价值。

(2)初始化dp[0][0]为0,表示不放入任何物品时价值为0。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期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、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

算法设计与分析实验报告

算法设计与分析实验报告

实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。

三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。

如果a>b则交换位置,如果a<b则不交换。

四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。

二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。

递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。

算法课设实验报告(3篇)

算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。

为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。

二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。

1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。

(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。

- 对每种算法进行时间复杂度和空间复杂度的分析。

- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。

(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。

- 编写三种排序算法的代码。

- 分析代码的时间复杂度和空间复杂度。

- 编写测试程序,生成随机测试数据,测试三种算法的性能。

- 比较三种算法的运行时间和内存占用。

2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。

(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。

- 分析贪心算法的正确性,并证明其最优性。

(3)实验步骤:- 分析活动选择问题的贪心策略。

- 编写贪心算法的代码。

- 分析贪心算法的正确性,并证明其最优性。

- 编写测试程序,验证贪心算法的正确性。

3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。

(2)实验内容:- 实现一个动态规划算法问题,如背包问题。

- 分析动态规划算法的正确性,并证明其最优性。

(3)实验步骤:- 分析背包问题的动态规划策略。

- 编写动态规划算法的代码。

- 分析动态规划算法的正确性,并证明其最优性。

- 编写测试程序,验证动态规划算法的正确性。

三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。

算法设计实验报告

算法设计实验报告

算法设计实验报告一、实验目的本次算法设计实验的主要目的是通过实际操作和分析,深入理解算法的原理和应用,提高解决实际问题的能力,培养创新思维和逻辑推理能力。

二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。

同时,为了进行算法的性能分析和可视化,还使用了一些相关的库,如 time 用于计算时间开销,matplotlib 用于绘制图表。

三、实验内容(一)排序算法的实现与比较1、冒泡排序冒泡排序是一种简单的排序算法。

它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

以下是冒泡排序的 Python 代码实现:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n i 1):if arrj > arrj + 1 :arrj, arrj + 1 = arrj + 1, arrj```2、快速排序快速排序是对冒泡排序的一种改进。

它采用了分治的策略,通过选择一个基准元素,将待排序的序列分割成两个子序列,其中一个子序列的所有元素都小于等于基准元素,另一个子序列的所有元素都大于等于基准元素,然后对这两个子序列分别进行快速排序。

以下是快速排序的 Python 代码实现:```pythondef quick_sort(arr, low, high):if low < high:pi = partition(arr, low, high)quick_sort(arr, low, pi 1)quick_sort(arr, pi + 1, high)def partition(arr, low, high):pivot = arrhighi =(low 1)for j in range(low, high):if arrj <= pivot:i = i + 1arri, arrj = arrj, arriarri + 1, arrhigh = arrhigh, arri + 1return (i + 1)```(二)搜索算法的实现与比较1、顺序搜索顺序搜索是一种最简单的搜索算法,它从数组的开头开始,依次比较每个元素,直到找到目标元素或者遍历完整个数组。

算法设计实训报告

算法设计实训报告

一、实训背景随着计算机科学技术的飞速发展,算法作为计算机科学的核心,其设计与应用越来越受到重视。

为了提高我们的算法设计能力,培养解决实际问题的能力,我们开展了为期一个月的算法设计实训。

本次实训以《算法设计与分析》课程为基础,通过理论学习、实验操作和实践应用,使我们深入理解了算法的基本概念、设计方法和分析技巧。

二、实训内容1. 理论学习(1)回顾了算法的基本概念,包括算法、算法复杂度、时间复杂度和空间复杂度等。

(2)学习了常用的算法设计方法,如分治法、动态规划、贪心算法、回溯法等。

(3)了解了不同算法的应用场景和适用范围。

2. 实验操作(1)使用C++语言实现了多种算法,如快速排序、归并排序、二分查找、插入排序等。

(2)针对实际问题,设计了相应的算法,如矩阵链相乘、背包问题、最小生成树等。

(3)对实验结果进行了分析,对比了不同算法的性能。

3. 实践应用(1)以小组为单位,针对实际问题进行算法设计,如数字三角形、投资问题等。

(2)编写程序代码,实现所设计的算法。

(3)对程序进行调试和优化,提高算法效率。

三、实训成果1. 提高了算法设计能力:通过实训,我们掌握了多种算法设计方法,能够根据实际问题选择合适的算法。

2. 增强了编程能力:实训过程中,我们熟练掌握了C++编程语言,提高了编程技巧。

3. 深化了算法分析能力:通过对算法复杂度的分析,我们能够更好地理解算法性能。

4. 培养了团队合作精神:在实训过程中,我们学会了与他人沟通、协作,共同完成任务。

四、实训总结1. 实训过程中,我们遇到了许多困难,如算法设计思路不明确、编程错误等。

通过查阅资料、请教老师和同学,我们逐步克服了这些问题。

2. 实训过程中,我们认识到算法设计的重要性。

一个好的算法可以显著提高程序运行效率,解决实际问题。

3. 实训过程中,我们学会了如何将实际问题转化为数学模型,并设计相应的算法。

4. 实训过程中,我们提高了自己的自学能力和解决问题的能力。

算法设计实验报告

算法设计实验报告

实验报告院部:计算机信息与科学专业班级:计科1703学号:学生姓名:学期: 2019-2020-2}printf("\n\n");bubble(a, n);printf("冒泡递增排列为:\n");for (i = 0; i < n; i++) {printf("%d ", a[i]);}printf("\n");printf("\n");printf("99乘法表如下:\n");chengfa(1, 1);system("pause");return 0;}图1-1 运行结果printf("您输入的字符串超过最大长度,请重新输入!");scanf("%s", X);}printf("请输入字符串Y:");scanf("%s", Y);while (strlen(Y) > 200){printf("您输入的字符串超过最大长度,请重新输入!");scanf("%s", Y);}s = LCS(X, Y);printf("X和Y的LCS数: %d \n", s);printf("----------------分割线----------------\n"); printf("投资最大利润问题:\n");profit();}图2-1 运行结果图3-1 运行结果五实验小节通过本次实验,充分理解了动态规划的基本思想和程序的执行过程,并且能熟练编写相应的程序;同时,在编程的过程中,进一步加深理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质,对上一次实验所学到的知识进行了进一步的巩固加强,学会了规避一些逻辑上的错误;熟练地掌握了典型的动态规划问题,能够运用动态规划思想分析问题的一般方法,对较简单的问题能够正确分析,设计出动态规划算法,并且能快速编程实现。

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

中山大学移动信息工程学院本科生实验报告(2015学年春季学期)课程名称:Algorithm design 任课教师:实验1 1259. Sum of Consecutive Primes1.实验题目ConstraintsTime Limit: 1 secs, Memory Limit: 32 MBDescriptionSome positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations does a given positive integer have? For example, the integer 53 has two representations 5 + 7 + 11 + 13 + 17 and 53. The integer 41 has three representations 2+3+5+7+11+13, 11+13+17, and 41. The integer 3 has only one representation, which is 3. The integer 20 has no such representations. Note that summands must be consecutive primenumbers, so neither 7 + 13 nor 3 + 5 + 5 + 7 is a valid representation for the integer 20.Your mission is to write a program that reports the number of representations for the given positive integer.InputThe input is a sequence of positive integers each in a separate line. The integers are between 2 and 10 000, inclusive. The end of the input is indicated by a zero.OutputThe output should be composed of lines each corresponding to an input line except the last zero. An output line includes the number of representations for the input integer as the sum of one or more consecutive prime numbers. No other characters should be inserted in the output.Sample Input231741206661253Sample Output1123122.实验目的掌握快速打印素数表的方法,比如素数筛法,以及对素数筛法进行优化。

3.程序设计解题思路:先打印10000以内的素数表。

对每个输入值,枚举连续的素数的起点,寻找是否有一段连续的素数与它相等,如果有则累加答案。

求素数算法原理:打印素数是一个比较基础的问题,掌握求素数的方法因而也是一项基本功。

(1)暴力:如果题目只需要判断少量数字是否为素数,可以直接枚举因子2...sqrt(N),检验是否整除N;只需要枚举到sqrt(N)的原因很直观,如果N在<sqrt(N)的范围找不到一个因子,则在> sqrt(N)也必然找不到,所以只有1和自身两个因子,故为素数。

时间复杂度:O(n*log(n))。

(2)排除法:根据课堂上的学习,我们知道算法如果写成线性算法,也就是O(n),已经算是不错了,但是最好的是O(Log(n))的算法,这是一个对数级的算法,二分取中(Binary Search)正是O(Log(n))的算法。

通常来说,O(Log(n))的算法都是以排除法做为手段的。

所以,找质数的算法完全可以采用排除法的方式。

如下所示,这种算法的复杂度是O(n(log(logn)))。

但是一般题目中要用到判断素数和求素数,数据规模也比较大的话,一般不用这种直接求法。

实际中的算法是,我把质数事先就计算好,放在一个文件中,然后在程序启动时(注意是在启动时读这个文件,而不是运行时每调用一次就读一次文件),读取这个文件,然后打印出来就可以了。

如果需要查找的化,二分查找或是hash表查找将会获得巨大的性能提升。

当然,这样的方法对于空间来说比前面两个都要消耗得大,但是你可以有O(log(n))或是O(1)的时间复杂度。

参考一些打印素数的方法:/articles/3738.html正则表达式检查素数(好像很NB的样子):/articles/2704.html /archives/algebra-with-regexes(3)素数筛法:任何合数都能表示成一系列素数的积。

一般的素数筛法:初始时,假设全部都是素数,当找到一个素数时,这个素数乘上另外一个数之后都是合数,把这些合数都筛掉(标记)。

这种算法缺点:会造成重复筛除合数,影响效率。

比如10,在i=2的时候,k=2*15筛了一次;在i=5,k=5*6 的时候又筛了一次。

所以,也就有了快速线性筛法。

快速线性筛法:不重复筛选(但是算法的时间复杂度不是O(n))快速线性素数筛法在这次的几道题目中都用到。

这部分的素数打印方法在后面的题目都有用到,比较重要,这里贴上完整代码:4.程序运行与测试样本输入样本输出5.实验总结与心得掌握了快速线性素数筛法。

实验2 1231. The Embarrassed Cryptography 1.实验题目ConstraintsTime Limit: 2 secs, Memory Limit: 32 MBDescriptionThe young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of users, which is now in use in his company. The cryptographic keys are created from the product of two primes, and are believed to be secure because there is no known method for factoring such a product effectively.What Odd Even did not think of, was that both factors in a key should be large, not just their product. It is now possible that some of the users of the system have weak keys. In a desperate attempt not to be fired, Odd Even secretly goes through all the users keys, to check if they are strong enough. He uses his very poweful Atari, and is especially careful when checking his boss' key.InputThe input consists of no more than 20 test cases. Each test case is a line with the integers 4 <= K <= 10100 and 2 <= L <= 106. K is the key itself, a product of two primes. L is the wanted minimum size of the factors in the key. The input set is terminated by a case where K = 0 and L = 0.OutputFor each number K, if one of its factors are strictly less than the required L, your program should output "BAD p", where p is the smallest factor in K. Otherwise, it should output "GOOD". Cases should be separated by a line-break.Sample Input143 10143 20667 20667 302573 302573 400 0Sample OutputGOODBAD 11GOODBAD 23GOODBAD 312.实验目的通过分析简化题目用意,提出解决问题的模型,比如在这道题目中,用9进制转换为10进制数即可。

3.程序设计解题思路:先预处理不超过10^6 的所有素数。

(筛法)对每个不超过L的素数,检查是否能整除K。

高精度运算。

(除法?快速取模?)数据规模大,有必要压缩(转换为大进制数,如1000进制)。

算法原理:高精度取余:这道题用简单的快速线性素数筛法+高精度取余就能过,但是TA提到可以使用一些改善高精度运算的效率的方法。

在网上查了一些文章,提到改善高精度运算的效率的方法: 扩大进制数。

理论上来说,高精度运算所用的数组中的每个数表示的数字越多,数组的长度就越小,程序运行的时间也就越短,但是,我们还需要考虑到计算机中的一个数的取值范围,必须保证它们在运算过程中不会越界。

比如扩大为1000进制数则如下:相对应的取余函数也要改变:4.程序运行与测试(1)快速线性素数筛+直接高精度除法,TLE检查后发现素数筛法忽略了偶数的标记。

虽然发现最后过不了的原因和这个无关。

这种就是没有标记素数2的倍数的。

改正:这个细节在这道题虽然不会影响结果,但是在其他的一些题目很可能就是一个很难察觉的BUG,所以写代码的时候还是要尽量使得代码健壮些。

相关文档
最新文档