算法设计与分析_总结0

合集下载

算法期末总结与反思

算法期末总结与反思

算法期末总结与反思本学期的算法课程已经接近尾声,回想起来,这一学期对于我来说是非常充实和有收获的。

在这门课上,我学习了许多经典的算法和数据结构、解决问题的方法以及算法设计的技巧。

同时,在实践中,我也提高了编程能力和解决实际问题的能力。

下面是我对本学期算法课程的总结与反思。

一、学到的知识和技能1. 数据结构:在本学期的算法课程中,我学习了很多重要的数据结构,包括链表、栈、队列、树、图等。

了解每种数据结构的特点、操作和应用场景,并能够根据实际问题选择合适的数据结构。

2. 算法基础:掌握了常见的算法基础知识,例如递归、分治、动态规划、贪心算法等。

能够运用这些算法模板解决复杂的问题,并能够分析算法的时间复杂度和空间复杂度。

3. 排序算法:学习了常见的排序算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。

了解每种排序算法的原理和实现方式,同时也熟悉了排序算法的性能比较和优化技巧。

4. 图算法:学习了图的表示方法和常见的图算法,例如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd算法)和最小生成树算法(Prim算法、Kruskal算法)等。

这些图算法在实际问题中有广泛的应用,对于解决一些复杂的问题非常有帮助。

5. 动态规划:通过学习动态规划的基本思想和常见的解决方法,我掌握了动态规划算法的设计和实现。

动态规划算法在解决一些具有重叠子问题的问题时非常有效,能够大大提高问题的求解效率。

6. 算法设计模式:学习了几种常见的算法设计模式,例如分治法、贪心法和动态规划等。

了解这些算法设计模式的思想和应用场景,并能够灵活运用到实际问题中。

7. 编程实践:通过课堂上的编程实践和作业练习,我提高了编程的能力和灵活运用算法的能力。

通过编写代码实现算法思想和解决具体问题,我深刻理解了算法的思想和实现过程。

二、收获和体会1. 提高了问题解决能力:在这门课程中,我学会了如何分析和解决实际问题。

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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. 通用性:算法能够适用于不同规模和类型的问题,并具有良好的扩展性。

二、算法的设计方法在设计算法时,可以采用不同的方法和策略。

下面介绍几种常见的算法设计方法:1. 分治法:将大问题划分成若干个相同或类似的小问题,逐个解决小问题,最后将结果合并。

2. 动态规划:将复杂问题划分成一系列相互联系的子问题,通过解决子问题来求解原问题。

3. 贪心算法:每次选择当前看起来最优的策略来解决问题,不考虑后续可能产生的影响。

4. 回溯法:采用试错的思想,尝试所有可能的答案,当发现不满足条件时,进行回溯重新尝试。

5. 随机算法:通过随机选择的方式求解问题,时间复杂度通常较高。

三、算法的复杂性分析算法的复杂性分析是评估算法的执行时间和所需资源的一种方法。

一般来说,常用的复杂性分析有时间复杂性和空间复杂性。

1. 时间复杂性:衡量算法执行所需的时间。

常见的时间复杂性表示方法有大O记法,表示算法执行时间的上限。

2. 空间复杂性:衡量算法执行所需的额外内存空间。

常见的空间复杂性表示方法也是大O记法,表示算法所需额外内存空间的上限。

通过复杂性分析,可以选择适当的算法来解决特定问题,并评估算法的性能。

四、常见的算法以下是几种常见的计算机算法:1. 排序算法:包括冒泡排序、选择排序、插入排序、快速排序等,用于按照一定规则对数据进行排序。

电大计算机本科_算法设计与分析

电大计算机本科_算法设计与分析

电大计算机本科_算法设计与分析
算法设计与分析是计算机科学和数学领域的重要课程。

它涉及到一系
列算法设计、分析和实现的方面,涉及到算法流程、语法、数据结构等多
方面。

在算法设计与分析这门课程中,学生首先要学习怎么设计一个算法,
怎么从实际问题中提取算法,怎么分析算法复杂度,怎么评价算法效率。

接下来要学习算法,基本排序算法和选择算法,分治算法,贪婪算法,动
态规划,回溯算法,朴素贝叶斯,马尔科夫链等等各种算法。

学生还要熟
悉现代算法建模工具(如Matlab、SAS、C++),熟悉算法的优化技巧,
掌握算法的编码实现方法,并研究其实际应用。

本课程可以使学生充分发挥自己的能力,培养学生的算法设计能力,
提高实践能力,掌握算法的基本原理及运用,把握算法分析及其优化技术。

它不仅帮助学生提高数学思维能力,同时也有助于他们在计算机编程方面
的能力。

学习算法设计与分析有助于学生全面掌握算法设计这一重要组成
部分,也可以拓展学生的应用领域,使学生更具有竞争力。

学习算法设计与分析也有其困难之处,首先是算法编程比较抽象,学
生需要有较强的理论功底和数学能力。

算法设计技巧与分析

算法设计技巧与分析

算法设计技巧与分析算法设计技巧是计算机科学领域中非常重要的一部分。

一个好的算法能够提高程序的效率,减少资源的消耗。

算法设计的技巧有很多种,比如递归、分治、贪心、动态规划等等。

以下将对一些常用的算法设计技巧进行分析和讨论。

递归是一种非常常见的算法设计技巧。

递归是指一个函数在执行的过程中会调用自身。

递归通常需要一个基本的情况和一个递推的情况。

递归的好处是能够简化问题的求解过程,但是递归也有一些缺点,比如递归的深度过大会导致栈溢出的问题。

在设计递归算法时,需要注意避免这种情况的发生。

分治是一种将问题分解成多个子问题并将子问题的解合并起来得到最终解的算法设计技巧。

分治算法通常可以通过递归来实现。

在设计分治算法时,需要注意子问题之间的关系,以及如何将子问题的解合并起来。

贪心是指每一步都选择当前最优解的算法设计技巧。

贪心算法通常需要证明每一步的最优解一定能够导致最终的最优解。

贪心算法的好处是简单、高效,但是贪心算法不能解决所有的问题,有些问题需要使用动态规划等其他算法进行求解。

动态规划是一种将问题分解成多个子问题并选择最优的子问题解组合得到最终解的算法设计技巧。

动态规划通常需要一个表格来存储中间的结果,以便后续的计算。

在设计动态规划算法时,需要注意问题的重叠子问题特性,以及如何利用已经计算过的结果来加速计算。

在进行算法设计时,还需要考虑时间复杂度和空间复杂度。

时间复杂度是用来衡量算法执行时间的参数,通常用“大O记法”来表示。

空间复杂度是用来衡量算法消耗的空间的参数,也用“大O记法”来表示。

在算法设计中,通常要追求时间复杂度和空间复杂度尽量低。

除了以上几种常见的算法设计技巧外,还有很多其他的算法设计技巧,比如回溯、剪枝等等。

在实际的算法设计中,不同的问题可能需要采用不同的算法设计技巧。

因此,对算法设计技巧的熟练掌握和运用是非常重要的。

综上所述,算法设计技巧与分析是计算机科学中的重要内容。

通过合理选择和运用不同的算法设计技巧,能够提高程序的效率,从而更好地解决问题。

算法设计与分析实验报告(中南民族大学)

算法设计与分析实验报告(中南民族大学)

院系:计算机科学学院专业:年级:课程名称:算法设计与分析基础班号:组号:指导教师:年月日实验结果及分析1.求最大数2.递归法与迭代法性能比较递归迭代3.改进算法1.利用公式法对第n项Fibonacci数求解时可能会得出错误结果。

主要原因是由于double类型的精度还不够,所以程序算出来的结果会有误差,要把公式展开计算。

2.由于递归调用栈是一个费时的过程,通过递归法和迭代法的比较表明,虽然递归算法的代码更精简更有可读性,但是执行速度无法满足大数问题的求解。

3.在当前计算机的空间较大的情况下,在一些速度较慢的问题中,空间换时间是一个比较周全的策略。

实验原理(算法基本思想)定义:若A=(a ij), B=(b ij)是n×n的方阵,则对i,j=1,2,…n,定义乘积C=A⋅B 中的元素c ij为:1.分块解法通常的做法是将矩阵进行分块相乘,如下图所示:二.Strassen解法分治法思想将问题实例划分为同一问题的几个较小的实例。

对这些较小实例求解,通常使用递归方法,但在问题规模足够小时,也会使用另一种算法。

如果有必要,合并这些问题的解,以得到原始问题的解。

求解矩阵相乘的DAC算法,使用了strassen算法。

DAC(A[],B[],n){If n=2 使用7次乘法的方法求得解ElseDivide(A)//把A分成4块Divide(B)//把B分成4块调用7次strassen算法求得解的4块合并这4块得到解并返回}伪代码Serial_StrassenMultiply(A, B, C) {T1 = A0 + A3;T2 = B0 + B3;StrassenMultiply(T1, T2, M1);T1 = A2 + A3;StrassenMultiply(T1, B0, M2);T1 = (B1 - B3);StrassenMultiply (A0, T1, M3);T1 = B2 - B0;StrassenMultiply(A3, T1, M4);T1 = A0 + A1;StrassenMultiply(T1, B3, M5);T1 = A2 – A0;T2 = B0 + B1;StrassenMultiply(T1, T2, M6);T1 = A1 – A3;T2 = B2 + B3;StrassenMultiply(T1, T2, M7);C0 = M1 + M4 - M5 + M7C1 = M3 + M5C2 = M2 + M4C3 = M1 - M2 + M3 + M6}实验结果及分析时间复杂度1.分块相乘总共用了8次乘法,因而需要Θ(n log28)即Θ(n3)的时间复杂度。

《算法设计与分析》课件

《算法设计与分析》课件

常见的贪心算法包括最小生成树算法 、Prim算法、Dijkstra算法和拓扑排 序等。
贪心算法的时间复杂度和空间复杂度 通常都比较优秀,但在某些情况下可 能需要额外的空间来保存状态。
动态规划
常见的动态规划算法包括斐波那契数列、背包 问题、最长公共子序列和矩阵链乘法等。
动态规划的时间复杂度和空间复杂度通常较高,但通 过优化状态转移方程和状态空间可以显著提高效率。
动态规划算法的时间和空间复杂度分析
动态规划算法的时间复杂度通常为O(n^2),空间复杂度为O(n)。
04 经典问题与算法实现
排序问题
冒泡排序
通过重复地遍历待排序序列,比较相邻元素的大小,交换 位置,使得较大的元素逐渐往后移动,最终达到排序的目 的。
快速排序
采用分治策略,选取一个基准元素,将比基准元素小的元 素移到其左边,比基准元素大的元素移到其右边,然后对 左右两边的子序列递归进行此操作。
动态规划是一种通过将原问题分解为若干个子 问题,并从子问题的最优解推导出原问题的最 优解的算法设计方法。
动态规划的关键在于状态转移方程的建立和状态 空间的优化,以减少不必要的重复计算。
回溯算法
01
回溯算法是一种通过穷举所有可能情况来求解问题的算法设计方法。
02
常见的回溯算法包括排列组合、八皇后问题和图的着色问题等。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。

算法设计与分析心得

算法设计与分析心得

算法设计与分析心得在当今数字化的时代,算法无处不在,从我们日常使用的手机应用到复杂的科学研究,从金融交易到交通管理,算法都在发挥着至关重要的作用。

作为一名对算法设计与分析充满兴趣和探索欲望的学习者,我在这个领域中经历了一段充满挑战与收获的旅程。

算法,简单来说,就是解决特定问题的一系列清晰、准确的步骤。

它就像是一本精心编写的指南,告诉计算机在面对各种情况时应该如何做出决策和处理数据。

而算法设计与分析,则是研究如何创造出高效、正确的算法,并评估它们在不同场景下的性能。

在学习算法设计的过程中,我深刻认识到了问题的定义和理解是至关重要的第一步。

如果不能清晰地明确问题的要求和约束条件,那么后续的设计工作就很容易偏离方向。

例如,在解决一个排序问题时,我们需要明确是对整数进行排序还是对字符串进行排序,是要求稳定排序还是非稳定排序,以及数据规模的大小等。

只有对这些细节有了准确的把握,我们才能选择合适的算法策略。

选择合适的算法策略是算法设计的核心。

这就像是在众多工具中挑选出最适合完成特定任务的那一个。

常见的算法策略包括分治法、动态规划、贪心算法、回溯法等。

每种策略都有其适用的场景和特点。

分治法将一个大问题分解为若干个规模较小、结构相似的子问题,然后逐个解决子问题,最后合并子问题的解得到原问题的解。

动态规划则通过保存子问题的解来避免重复计算,从而提高效率。

贪心算法在每一步都做出当前看起来最优的选择,希望最终能得到全局最优解。

回溯法则通过不断尝试和回退来寻找问题的解。

以背包问题为例,如果我们要求在有限的背包容量内装入价值最大的物品,贪心算法可能会因为只考虑当前物品的价值而忽略了整体的最优解。

而动态规划则可以通过建立状态转移方程,计算出在不同容量下能获得的最大价值,从而得到准确的最优解。

在实现算法的过程中,代码的准确性和可读性同样重要。

清晰的代码结构和良好的注释能够让我们更容易理解和维护算法。

而且,在实际编程中,还需要考虑边界情况和异常处理,以确保算法的健壮性。

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

这本书是《算法设计与分析》王红梅编著一共有以下12章,我们学了1、3、4、5、6、7、8、9分别是“绪论、蛮力法、分治法、减治法、动态规划法、贪心法、回溯法、分治限界法第1章绪论考点:1、算法的5个重要特性。

(P3)答:输入、输出、有穷性、确定性、可行性2、描述算法的四种方法分别是什么,有什么优缺点。

(P4)答:1. 自然语言优点:容易理解;缺点:容易出现二义性,并且算法都很冗长。

2. 流程图优点:直观易懂;缺点:严密性不如程序语言,灵活性不如自然语言。

3. 程序设计语言优点:用程序语言描述的算法能由计算机直接执行;缺点:抽象性差,是算法设计者拘泥于描述算法的具体细节,忽略了“好”算法和正确逻辑的重要性,此外,还要求算法设计者掌握程序设计语言及其编程技巧。

伪代码优点:表达能力强,抽象性强,容易理解3、了解非递归算法的时间复杂性分析。

(P13)要点:对非递归算法时间复杂性的分析,关键是建立一个代表算法运行时间的求和表达式,然后用渐进符号表示这个求和表达式。

非递归算法分析的一般步骤是:(1)决定用哪个(或哪些)参数作为算法问题规模的度量。

(2)找出算法的基本语句。

(3)检查基本语句的执行次数是否只依赖问题规模。

(4)建立基本语句执行次数的求和表达式。

(5)用渐进符号表示这个求和表达式。

[例1.4]:求数组最小值算法int ArrayMin(int a[ ], int n){min=a[0];for (i=1; i<n; i++)if (a[i]<min) min=a[i];return min;}问题规模:n基本语句:a[i]<minT(n)= n-1=O(n)4、掌握扩展递归技术和通用分治递推式的使用。

(P15)扩展递归技术:通用分支递归式:5、习题1-4,习题1-7设计算法求数组中相差最小的两个元素(称为最接近数)的差。

要求给出伪代码描述,并用一组例子进行跟踪验证,写出验证过程。

(1)伪代码1. 令最小距离min等于数组头两个元素R[0]和R[1]的差的绝对值;2. 从i=0循环至i<n-1,对于每个R[i]2.1 分别求其与j=i+1至j<n的数的差的绝对值;2.2 如果此值小于最小距离,则令新的最小距离为此值;3. 输出最小距离。

(2)用实例进行跟踪验证R[6]={10,5,11,16,30,14},n=6;Min=|10-5|=5;i=0,j=1, |R[i]-R[j]|=|10-5|=5;j=2,|R[i]-R[j]|=|10-11|=1<min;min=1;j=3, |R[i]-R[j]|=|10-16|=6;j=4, |R[i]-R[j]|=|10-30|=20;j=5, |R[i]-R[j]|=|10-14|=4;i=1,j=2, |R[i]-R[j]|=|5-11|=6;j=3, |R[i]-R[j]|=|5-16|=11;j=4, |R[i]-R[j]|=|5-30|=15;j=5, |R[i]-R[j]|=|5-14|=9;i=2,j=3, |R[i]-R[j]|=|11-16|=5;j=4, |R[i]-R[j]|=|11-30|=19;j=5, |R[i]-R[j]|=|11-14|=3;i=3,j=4, |R[i]-R[j]|=|16-30|=14;j=5, |R[i]-R[j]|=|16-14|=2;i=4,j=5, |R[i]-R[j]|=|30-14|=16;最后输出min=17、使用扩展递归技术求解下列递推关系式(1)(2)第3章蛮力法1、掌握蛮力法的设计思想:蛮力法依赖的基本技术——扫描技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解;关键——依次处理所有元素。

2、蛮力法的代表算法及其时间复杂度:顺序查找,O(n)串匹配(BF O(n*m),KMP O(n+m),BM O(n*m))选择排序,O(n2)冒泡排序,O(n2)生成排列对象(排列问题),O(n!)生成子集(组合问题),O(2n)0/1背包属于组合问题。

任务分配,哈密顿回路,TSP问题属于排列问题。

最近对问题O(n2),凸包问题O(n3)3、掌握BF和KMP算法的原理,能够画出比较过程。

P71习题3的4。

要求给出一串字符串,能够求出对应的next数组,并能使用KMP算法进行比较匹配。

4、掌握选择排序和冒泡排序算法描述和时间复杂性,要求能够写出伪代码。

(P56-58)选择排序算法描述:选择排序开始的时候,扫描整个序列,找到整个序列的最小记录和序列中的第一记录交换,从而将最小记录放到它在有序区的最终位置上,然后再从第二个记录开始扫描序列,找到n-1个序列中的最小记录,再和第二个记录交换位置。

一般地,第i趟排序从第i个记录开始扫描序列,在n-i+1个记录中找到关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。

时间复杂性:O(n2)伪代码:冒泡排序算法描述:冒泡排序开始的时候扫描整个序列,在扫描过程中两两比较相邻记录,如果反序则交换,最终,最大记录就能被“沉到”了序列的最后一个位置,第二趟扫描将第二大记录“沉到”了倒数第二个位置,重复上述操作,直到n-1趟扫描后,整个序列就排好序了。

冒泡排序,O(n2)5、算法设计题:习题3-3,3-6,3-8,3-11,3-133-3 对于KMP算法中求next数组问题,设计一个蛮力算法,并分析其时间性能。

1.voidGetNext(char T[ ], int next[ ])2.{3. next[1]=0;4. next[2]=1;5. j=T[0],k=0;6.for(;j>2;j--){7.for(n=j-2;n>=1;n--){//n为要比较的前缀的最后一个字符的下标8. m=j-n;//m为要比较的后缀的第一个字符的下标9.for(i=1;i<=n;i++)10. {11.if(T[i]!=T[m+i-1])break;12. }13.if(i==n+1){next[j]=n+1;break;}14. }15.if(n==0)next[j]=1;16. }17.}3-4 假设在文本“ababcabccabccacbab”中查找模式“abccac”,求分别采用BF算法和KMP算法进行串匹配过程中的字符比较次数。

由此可知,用BF算法一共要进行3+1+4+1+1+6+1+1+1+6=25次比较方能匹配出KMP算法:next[]={,0,1,1,1,1,2};由此可知,用KMP算法一共要进行3+4+6+5=18次比较方能匹配出参考代码如下:排列最终存储在长度为n的阶乘,元素类型为指针的数组中,数组指向一个排列,具体的排列数据存储在数组中。

1.int fabs(int n)2.{3.int r=1;4.for(inti=n;i>1;i--)5. r=r*i;6.return r;7.8.}9.10.//排列存储在数组中11.void getArrangement(int**&s,int n)12.{13.int * p,*q;14.int * *s1;15.int i,j,k,l,m,o;16. s=new int *[1];17. s[0]=newint[1];18. s[0][0]=1;19.for(i=2;i<=n;i++)20. {21. j=0;22. o=0;23. m=fabs(i-1);24. s1=newint *[fabs(i)];25.while(o<m)26. {27. q=p=s[o];28.for(k=i-1;k>=0;k--)29. {30. s1[j]=newint[i];31.for(l=0;l<i;l++)32. {33.if(l==k){s1[j][l]=i;}34.else{35. s1[j][l]=*p;36. p++;}37. }38. j++;39. p=q;40. }41. o++;42.delete[] q;43. }44.delete[]s;45. s=s1;46. }47.}3-8对于一个平面上n个点的集合S,设计蛮力算法求集合S的凸包的一个极点。

点集合中最左边或者最右边的点一定是凸包的一个极点,则求凸包的极点的问题转化为求点的x坐标最大或最小的点1.int getPole(int x[],int y[],int n)2.{3.int r=0;4.for(inti=0;i<n;i++)5. {6.if(x[i]>x[r])r=i;7. }8.return r;3-11 设计算法生成在n个元素中包含k个元素的所有组合对象。

两种思路:1、生成所有的组合,在组合中找元素个数为k个的组合。

伪代码:1.初始化一个长度为n的比特串s=00…0并将对应的子集输出;2.for(i=1; i<2n; i++) //注意不能书写成i<=2n2.1 s++;2.2 判断s中1的个数,若为k,则将s对应的子集输出;2、使用k层嵌套循环生成元素个数为k个的组合。

设k=3;n个元素存储在数组a[]中;伪代码:for (i=1; i<n-2; i++)for(j=i+1; i<n-1; i++)for(k=j+1; i<n; i++)输出a[i]a[j]a[k]构成的组合。

3-13美国有个连锁店叫7-11这个连锁店以前是每天7点开门,晚上11点关门不过现在是全天24小时营业。

有一天,有个人来到这个连锁店,买了4件商品营业员拿起计算器敲了一下,说:总共是$7.11顾客开玩笑说:所以你们商店就叫7-11?营业员没有理她,说:当然不是,我是把它们的价格相乘之后得到的。

顾客说:相乘?你应该把他相加才对。

营业员说,我弄错了。

接着又算了一遍,结果让两个人吃惊的是:计算结果也是$7.11请问,这4件商品的价格是多少?参考代码:1.#include<iostream.h>2.#include <stdio.h>3.int main()4.{5.long i,j,k,m;6.7.for (i=1; i <=711/4 ; i++)8.{9.for (j=i; j <=711/3 ; j++)10.{11.for (k=j; k <=711/2 ; k++)12.{13.m=711-i-j-k;14.if (i*j*k*m==711*1000000)15.{16.cout<<i<<endl<<j<<endl<<k<<endl<<m<<endl;17. }18.}19.}20.}21.return 0;22.}输出结果为:价格分别是1.2 1.25 1.5 3.16第4章分治法了解分治法的设计思想设计思想:将要求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。

相关文档
最新文档