贪心算法-会场安排问题
第二章 算法概述(下)

枚举法的应用
打印“九九乘法表” 可使用枚举法的问题还有如
完全平方数 完全平方数是指能写成一个正整 数的平方的数,如25=5^2,所以, 25是完全平方数。100=10^2,所 以,100也是完全平方数。
17
百钱买百鸡问题:有一个人有一百块钱,打算买 一百只鸡。到市场一看,大鸡三块钱一只,小鸡 一块钱三只,不大不小的鸡两块钱一只。现在, 请你编一程序,帮他计划一下,怎么样买法,才 能刚好用一百块钱买一百只鸡? 此题很显然是用枚举法,我们以三种鸡的个数 为枚举对象(分别设为x,y,z),以三种鸡的总数( x+y+z)和买鸡用去的钱的总数(x*3+y*2+z/3)为 判定条件,穷举各种鸡的个数。
11
问题分析:
使用列表保存5种水果名。 通过三重循环结构,枚果(解空间) 它们互不相等(筛选条件) 摆放先后次序有区别
•
输出所有可能的方案。
12
算法步骤描述:
步骤1:建立水果列表fruit; 步骤2:使变量x遍历fruit 步骤3:对于x的每个值,使变量y遍历fruit 步骤4:对于x、y的每个值,使变量z遍历fruit 步骤5: 若zx且 zy 且xy 打印该方案
29
递推与迭代
递推的过程实际上就是迭代的过程,即 不断用变量的旧值推出新值的过程。 一般递推使用数组(列表),在循环处 理时利用其下标的变化实现变量的迭代 ,而狭义的迭代是指使用简单变量来完 成这一过程。
30
程序设计中的数组(列表)是指具有相同 名称、通过下标区分的一组变量。 如:a[0]、a[1]、a[2]或b[1,1]、b[1,2] 、b[1,3]、b[2,1]、b[2,2]、b[2,3]等。 在循环结构中,通过变量控制其下标值的 变化(如a[i]、b[i,j]),达到变量轮换的目的。 例如:循环:从a[0]到a[9] 循环:a[i], i从0到9
经典贪心题

贪心算法是一种在解决问题的过程中追求局部最优的算法,对于一个有多种属性的事物来说,贪心算法会优先满足某种条件,追求局部最优的同时希望达到整体最优的效果。
以下是一些经典的贪心算法问题:1. 背包问题:给定一组物品,每个物品都有自己的重量和价值,背包的总容量有限。
贪心算法需要选择物品以最大化背包中物品的总价值,同时不超过背包的总容量。
这种问题可以有多种变体,例如分数背包问题和完全背包问题。
2. 硬币找零问题:给定一组硬币的面值和数量,以及需要找零的金额。
贪心算法需要选择硬币以最小化找零的总数量。
这个问题可以通过从大到小排序硬币,并从最大面值的硬币开始选择,直到找零的金额达到所需的总金额。
3. 区间选点问题:给定一系列闭区间,每个闭区间都有一个起始点和结束点。
贪心算法需要选择尽量少的点,使得每个闭区间内至少有一个点被选中。
这个问题可以通过对结束点进行排序,并从左到右选择结束点,直到下一个要选择的结束点与上一个选择的结束点之间的距离大于当前选择的结束点与上一个选择的结束点之间的距离为止。
4. 区间覆盖问题:给定一系列闭区间,贪心算法需要选择尽量少的区间,使得所有区间都被覆盖。
这个问题可以通过对每个闭区间的左端点进行排序,并从左到右选择左端点,直到下一个要选择的左端点与上一个选择的左端点之间的距离大于当前选择的左端点与上一个选择的左端点之间的距离为止。
5. 排班问题:给定一组员工和他们的班次需求,以及一组工作日的日程安排。
贪心算法需要为员工分配班次,以最小化总工作时间并满足所有工作日的需求。
这个问题可以通过从可用的班次中选择最长的班次,并从左到右分配员工,直到所有员工都被分配到一个班次为止。
这些问题是贪心算法的经典示例,它们展示了贪心算法在解决优化问题中的广泛应用。
算法(复习题)1

平均情况:设待查找的元素在数组中的概率为P,不在数组中的概率为1-P,若出现在数组中每个位置的概率是均等的为p/nT(n)=P1D1+P2D2+...+PiDi+(1-P)Dn+1=p/2+n(1-p/2)1.叙述分治算法和动态规划算法的基本思想,并比较两种算法的异同。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解. 动态规划将待求解的问题分解成若干的子问题,自底向上地通过求解子问题的解得到原问题的解。
动态规划将每个子问题只求解一次并将其解保存在一个表格中,当需要再次求解此子问题时,只是简单的通过查表过的该子问题的解,避免了大量的重复计算.异同:分治法求解的问题分解后的子问题都是独立的,而使用动态规划求解的问题分解后得到的子问题往往不是相互独立的。
分治法是自顶向下用递归的方法解决问题,而动态规划则是自底向上非递归解决问题。
1.简述分治算法求解过程的三个阶段。
答:(1)划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。
(2)求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。
(3)合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。
2.叙述分治法的基本思想,并分析分治法与减治法二者的区别。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解.区别:分治法是把一个大问题划分成若干个子问题,分别求解各个子问题,然后把子问题的解进行合并并得到原问题的解。
减治法同样是把一个大问题划分成若干个子问题,但是这些子问题不需要分别求解,只需求解其中的一个子问题,因而也无需对子问题的解进行合并。
活动选择问题

活动选择问题问题描述:假定有⼀个活动的集合S含有n个活动{a1,a2,…,a n},每个活动a i都有⼀个开始时间s i和结束时间f i,0≤s i<f i<∞。
同时,这些活动都要使⽤同⼀资源(如演讲会场),⽽这个资源在任何时刻只能供⼀个活动使⽤。
活动的兼容性:如果选择了活动a i,则它在半开时间区间[s i,f i)内占⽤资源。
若两个活动a i和a j满⾜[s i,f i)与区间[s j,f j)不重叠,则称它们是兼容的。
活动选择问题:就是对给定的包含n个活动的集合S,在已知每个活动开始时间和结束时间的条件下,从中选出最多可兼容活动的⼦集合,称为最⼤兼容活动集合。
不是⼀般性,设活动已经按照结束时间单调递增排序:f1≤f2≤...≤f n例:设有11个待安排的活动,它们的开始时间和结束时间如下,并设活动按结束时间的⾮递减次序排列:i1234567891011s i130535688212f i4567991011121416则{a3,a9,a11} 、{a1,a4,a8,a11} 、 {a2,a4,a9,a11}都是兼容活动集合。
其中{a1,a4,a8,a11} 、 {a2,a4,a9,a11}是最⼤兼容活动的集合。
显然最⼤兼容活动集合不⼀定是唯⼀的。
动态规划做法活动选择问题的最优⼦结构令S i,j表⽰在a i结束之后开始且在a j开始之前结束的那些活动的集合。
问题和⼦问题的形式定义如下:设A i,j是S i,j的⼀个最⼤兼容活动集,并设A i,j包含活动a k,则有:A i,k表⽰A i,j中a k开始之前的活动⼦集,A k,j表⽰A i,j中a k结束之后的活动⼦集。
并得到两个⼦问题:寻找S i,k的最⼤兼容活动集合和寻找S k,j的最⼤兼容活动集合。
活动选择问题具有最优⼦结构性,也即:A i,k是S i,k ⼀个最⼤兼容活动⼦集,A k,j是S k,j的⼀个最⼤兼容活动⼦集。
⽽A i,j=A i,k∪a k∪A k,j。
算法分析与设计教程习题解答_秦明

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(--=n n f n② )log *()(n n n f O =6. 解:算法略。
《算法分析与设计》说课

8
8
8
10
S4
贪心算法
6
6
S5
回溯法
6
8
S6
分支限界
6
8
S7
随机化算法 总学时数
4 40
6 48
说课程教学大纲
5、课外学习内容 分支 限界 算法 设计 分治 分治 最强大脑—数独 阶乘 递归 兔子问题 会场安排问题 国王分财产
银行最优服务次序
回溯 法 贪心 贪心 算法 算法
矩阵连乘 租用游艇 排序问题
•难点模块
分治策略
动态规划 贪心算法
•难点内容
分治策略的应用
分解最优解结构 构造递归关系
回溯法
分支限界法
判断是否满足贪心性质
回溯法--剪枝函数 解空间树
说课导航
说课程教学大纲
说教学资源 说教学方法与手段 说学情与学法指导 说教学过程设计
说考核评价
说教学资源
1、教材选用原则
国家级规划教材 原则
具有先进性、适用性、时效性
汽车加油行驶 网球循环赛比赛日程
动态 规划
充分体现案例驱动、实践导向的设计思想
说课程教学大纲
6、课程重点
•重点模块
递归与分治策略
动态规划算法 贪心算法
•重点内容
二分搜索与排序
矩阵连乘 最长公共子序列
回溯法
分支限界法
最大字段和
0-
说课程教学大纲
7、课程难点
经典教材
说教学资源
王晓东教授编著的 《计算机算法设计与分析》 (C++描述)
说教学资源
2、网络资源
课外学习网站:
/JudgeOnline/problemtypelist.php
贪心算法求解最优解问题
贪心算法求解最优解问题贪心算法是计算机科学领域中常用的一种算法。
它常常被用来求解最优解问题,如背包问题、最小生成树问题、最短路径问题等。
贪心算法解决最优解问题的基本思路是,每一步都选取当前状态下最优的解决方案,直到达到全局最优解。
在这篇文章中,我们将为大家深入探讨贪心算法求解最优解问题的基本思路、算法复杂度和应用场景等方面的知识。
基本思路贪心算法是一种基于贪心策略的算法。
其核心思想是,每一步都采用当前最优策略,以期最终达到全局最优解。
在贪心算法中,每个子问题的最优解一般都是由上一个子问题的最优解推导出来的。
因此,关键在于如何找到最优解。
具体而言,贪心算法一般由三部分组成,分别为:状态、选择和判断。
首先,需要明确当前问题的状态,即问题的规模和限制条件。
然后,在当前的限制条件下,我们需要从可能的方案中选择出最优的方案,并把这个选择作为解的一部分。
最后,需要判断选择是否符合问题的限制条件,是否达到全局最优解。
算法复杂度在进行算法分析时,我们需要考虑算法的时间复杂度和空间复杂度。
对于贪心算法而言,其时间复杂度一般是 O(nlogn) 或 O(n) 级别的,其中 n 表示问题的规模。
这种效率在实际应用中表现出了很高的稳定性和效率。
应用场景贪心算法通常应用于需要求解最优解问题的场景中。
例如:- 贪心算法可以用来求解背包问题。
在背包问题中,我们需要在限定的空间内选取最有价值的物品装入背包中以努力获得最大的收益。
在贪心策略下,我们只需要按单位重量价值从大到小的顺序进行选择,就可以得到最优解;- 贪心算法也可以用来求解最小生成树问题。
这个问题是指,在给定一个图的时候,我们需要选出一棵生成树,使得生成树上的所有边权之和最小。
在此问题中,我们可以将图上的边权按大小排序,然后顺序选择边直至生成树。
这样,我们可以得到与全局最优解很接近的解;- 贪心算法还可以用来求解最短路径问题。
在最短路径问题中,我们需要找到从一个节点到另一个节点的最短路径。
排队问题的三种方法
排队问题的三种方法排队问题是一类经典的图论问题,通常涉及到在一条流水线上安排生产任务或者服务请求,使得所有任务或者请求都能够及时完成,本文将介绍三种解决排队问题的方法。
方法一:贪心算法贪心算法是一种简单的算法思想,通过每次选择最优解来得到全局最优解。
在排队问题中,贪心算法可以通过不断尝试最坏情况来得到最优解。
具体来说,我们可以从最后一个待安排的任务开始,依次将当前任务和已经安排的任务进行交换,直到任务队列为空。
这种方法能够保证所有的任务都能够及时完成,但是可能会出现任务队列为空的情况,也就是没有任务可以安排。
方法二:动态规划算法动态规划算法是一种通过构建状态转移方程来求解问题的方法,通常适用于问题的规模较大或者最优解不是唯一的情况。
在排队问题中,我们可以将任务队列看作是状态,任务等待时间和执行任务的时间看作是状态转移方程。
具体来说,我们可以从最后一个待安排的任务开始,依次计算出当前任务需要等待的时间和已经安排的任务需要执行的时间,然后将当前任务和已经安排的任务进行交换,直到任务队列为空。
这种方法可以得到最优解,但是需要计算大量的状态转移方程。
方法三:图论算法图论算法是一种通过构建图来分析问题的方法,通常适用于问题的规模较大或者最优解不是唯一的情况。
在排队问题中,我们可以将任务队列看作是一个图,任务之间的等待关系看作是边,然后通过最小生成树或者贪心算法来得到最优解。
具体来说,我们可以从最后一个待安排的任务开始,依次将当前任务和已经安排的任务进行交换,直到任务队列为空。
这种方法可以得到最优解,但是需要计算大量的边。
以上三种方法是解决排队问题的常见方法,贪心算法适用于没有最优解的情况,动态规划算法适用于有多个最优解的情况,图论算法适用于问题规模较大的情况。
此外,排队问题的拓展应用还有很多,例如排队论、排队系统、排队论模型等。
贪心算法
有人说贪心算法是最简单的算法,原因很简单:你我其实都很贪,根本不用学就知道怎么贪。
有人说贪心算法是最复杂的算法,原因也很简单:这世上会贪的人太多了,那轮到你我的份?贪心算法详解贪心算法思想:顾名思义,贪心算法总是作出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
如单源最短路经问题,最小生成树问题等。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
贪心算法的基本要素:1.贪心选择性质。
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2. 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
贪心算法的基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。
当达到算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:1. 不能保证求得的最后解是最佳的;2. 不能用来求最大或最小解问题;3. 只能求满足某些约束条件的可行解的范围。
实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步do求出可行解的一个解元素;由所有解元素组合成问题的一个可行解;用背包问题来介绍贪心算法:背包问题:有一个背包,背包容量是M=150。
妙趣横生的算法(C++语言实现)
第4篇 算法实战篇
11 数学趣题解决方法
01
11.1 求两个 数的最大公约 数和最小公倍 数
02
11.2 魔幻方 阵的解法
03
11.3 广场该 建多大
04
11.4 水仙花 数
05
11.5 通向女 友之路
06
11.6 八皇后 问题
第4篇 算法实战篇
06
11.12 三 色球
01
11.7 洗扑 克问题
7.4 每对顶点 间的最短路径
7.5 网络流
7 高级图算法
7.1 拓扑排序
7.1.1 算法描述 7.1.2 算法实现 7.1.3 实例分析与应用
7 高级图算法
7.2 最小生成树
7.2.1 算法描述 7.2.2 算法实现
7 高级图算法
7.3 单源最短路径
7.3.1 算法描述 7.3.2 算法实现 7.3.3 应用实例与分析
5 排序算法
5.5 希尔排序
5.5.1 算法描述 5.5.2 算法实现 5.5.3 应用实例与分析
5 排序算法
5.6 选择排序
5.6.1 算法描述 5.6.2 算法实现 5.6.3 应用实例与分析
5 排序算法
5.7 堆排序
5.7.1 堆 5.7.2 堆排序算法描述 5.7.3 算法实现 5.7.4 应用实例与分析
8 动态规划
8.2 动态规划应用实 例分析
8.2.6 设计竞赛题目问题 8.2.7 双人游戏策略问题 8.2.8 音乐CD最大曲目数问题 8.2.9 求Jerry最快到达的时间 问题 8.2.10 陪审团人选问题
9 贪心算法
9.1 贪心算法概述 9.1.1 算法描述
9.1.2 算法原理 9.2 应用实例与分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
。
-可编辑修改-
计算机算法设计与分析(第3版)
128页
算法实现题4-1 会场安排问题
问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个
有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动 作为图的一
个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着 色数,相应于要找的
最小会场数。) 编程任务: 对于给定的 k 个待安排的活动,编程计算使用最少会场的时间
表。 Input 输入数据是由多组测试数据组成。每组测试数据输入的第一行有 1 个正整数
k, 表示有 k 个待安排的活动。接下来的 k 行中,每行有 2 个正整数,分别表示 k 个
待安排的活动开始时间和结束时间。时间以 0 点开始的分钟计。 Output 对应每组输入,
输出的每行是计算出的最少会场数。
源代码:
#include
int fnPartition(int a[], int low, int high)
{
int i,j;
int x = a[low];
i = low;
j = high;
while(i
。
-可编辑修改-
while(i
if(i
if(i
a[i] = x;
return i;
}
void fnQuickSort(int a[],int low, int high)
{
int pos;
if(low < high)
{
pos = fnPartition(a,low,high);
fnQuickSort(a,low,pos-1);
fnQuickSort(a,pos+1,high);
}
}
int fnSchedule(int a[],int b[],int s,int e)
{
int n=0; int i=s+1; if (a[s]>-1)
。
-可编辑修改-
{
n = 1;
for(; i <=e; i++) if(a[i]>=b[s]) s++; else n++;
}
return n;
}
int main(void)
{
int n,i;
while(1 == scanf("%d",&n))
{
int *st = new int [n];
int *et = new int [n];
for (i = 0; i
fnQuickSort(et,0,n-1);
printf("%d\n",fnSchedule(st,et,0,n-1));
delete []st; delete []et;
} return 0;
}
输入文件示例: 输出文件示例:
。
-可编辑修改-
5 3
1 23
12 28
25 35
27 80
36 50