贪心法解活动安排问题(计算机算法设计与分析)

合集下载

贪心算法(4):活动选择问题

贪心算法(4):活动选择问题

贪⼼算法(4):活动选择问题我们继续回到上⼀堂课留下的课外习题:活动选择问题。

活动选择问题是很常见的场景。

例如各个部门共享⼀个会议室,利⽤该算法能使会议室安排尽量多的会议。

【问题】给你n个活动的开始时间和结束时间,从中选择你可以参与的活动,但是同⼀时间你只能参与⼀个活动,请找出你可以参与的最多活动数。

例如:考虑下⾯3个活动a1,a2和a3, 它们{开始时间点,结束时间点}分别为:a1 {start=10,finish=20}a2 {start=12,finish=25}a3 {start=20,finish=30}贪⼼算法直接在每⼀步选择当前看来最好的选择。

在开始时,选择活动结束时间最早的那个活动,这样能够给其他活动尽可能的腾出多余的时间。

⽽后每⼀步都在剩下的活动中选取,也遵循类似的原则。

由于获取已经按照结束时间排序好,所以这⾥第⼀个选择的活动就是a0,由于a0于时间20结束,马上再找⼀个活动,只有a2可以选择,a2结束之后再也没有活动可选了。

因此得到答案:最多可以参加两个活动(a0,a2)。

算法分析和设计现在请你设计⼀种贪⼼算法解决类似活动选择问题。

我们设计下列贪⼼算法的贪⼼策略:选择其余活动中完成时间最短的下⼀个活动,并且开始时间⼤于或等于先前所选活动的结束时间。

我们可以根据他们的完成时间对活动进⾏排序,以便我们始终将下⼀个活动视为最⼩完成时间活动。

算法描述如下{k}}U{1},必定仍然是⼀个最佳解决⽅案,说明如下:因为S 中的活动是独⽴的,⽽在排序队列中,【活动1】在所有活动中具有最⼩的结束时间,因为k不等于1,【活动k】的完成时间必定是⼤于等与【活动1】的完成时间,因此把【活动k】换成【活动1】后的新⽅案S‘必定也是最佳解决⽅案。

算法实现在以下C/C++代码实现中,假设活动已根据其完成时间进⾏了排序。

#include<stdio.h>// n --> 活动个数// s[] --> 数组保存所有活动的开始时间// f[] --> 数组保存所有活动的结束时间void printMaxActivities(int s[], int f[], int n){int i, j;printf ('选择以下的活动\n');// 第⼀个活动总是选中i = 0;printf('%d ', i);// 依次检查余下的活动for (j = 1; j < n; j++){//如果某活动在之前选择的活动结束之后开始if (s[j] >= f[i]){printf ('%d ', j);i = j;}}}//主程序int main(){int s[] = {1, 3, 0, 5, 8, 5};int f[] = {2, 4, 6, 7, 9, 9};int n = sizeof(s)/sizeof(s[0]);printMaxActivities(s, f, n);return 0;}注意:若是finish数组没有排序,需要先对它进⾏排序。

c++贪心算法经典例题

c++贪心算法经典例题

c++贪心算法经典例题
经典的贪心算法例题有很多,以下是其中几个常见的例题:
1. 分糖果问题:
有一群小朋友,每个人都有一个评分。

现在需要给他们分糖果,要求评分高的小朋友比他旁边评分低的小朋友拥有更多的糖果。

求至少需要准备多少糖果。

2. 区间覆盖问题:
给定一个区间集合,每个区间表示一个工作时间段。

现在需要选择尽可能少的区间,覆盖整个时间范围。

求最少需要选择多少个区间。

3. 最佳买卖股票时机:
给定一个股票的价格列表,可以任意次数买入和卖出股票。

但是同一时间只能持有一支股票,求能够获得的最大利润。

4. 最大会议安排:
给定一系列的会议,每个会议有开始时间和结束时间。

要求安排尽可能多的会议,使得它们不会发生时间上的冲突。

5. 跳跃游戏:
给定一个非负整数数组,每个元素表示在该位置上能够跳跃的最大长度。

初始位置在第一个元素,判断能否跳到最后一个元素。

以上仅是一些常见的例题,贪心算法广泛应用于各种问题中。

在解决实际问题时,需要根据具体情况设计贪心策略,找到合适的贪心策略才能得到正确的解答。

贪心算法程序设计

贪心算法程序设计

贪心算法程序设计贪心算法程序设计1. 什么是贪心算法贪心算法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。

贪心算法的核心思想是局部最优解能导致全局最优解。

2. 贪心算法的基本步骤贪心算法的基本步骤如下:1. 定义问题的优化目标。

2. 将问题分解成子问题。

3. 选择当前最优的子问题解,将子问题的解合并成原问题的解。

4. 检查是否达到了问题的优化目标,如果没有达到,则回到第二步,继续寻找下一个最优子问题解。

5. 在所有子问题解合并成原问题解后,得到问题的最优解。

3. 贪心算法的应用场景贪心算法的应用非常广泛,几乎可以用于解决各种优化问题。

以下几个常见的应用场景:1. 零钱找零问题:给定一定面额的纸币和硬币,如何找零使得所需纸币和硬币的数量最小?2. 区间调度问题:给定一些活动的开始时间和结束时间,如何安排活动使得可以办理的活动数量最大?3. 背包问题:给定一些具有重量和价值的物品,如何选择物品使得背包的总价值最大?4. 最小树问题:给定一个带权无向图,如何找到一棵树,使得它的边权之和最小?5. 哈夫曼编码问题:给定一组字符和相应的频率,如何构造一个满足最低编码长度限制的二进制编码?4. 贪心算法的优缺点贪心算法的优点是简单、高效,可以快速得到一个近似最优解。

而且对于一些问题,贪心算法能够得到全局最优解。

贪心算法的缺点在于它不一定能够得到全局最优解,因为在每一步只考虑局部最优解,无法回溯到之前的选择。

5. 贪心算法的程序设计在使用贪心算法进行程序设计时,通常需要以下几个步骤:1. 定义问题的优化目标。

2. 将问题分解成子问题,并设计子问题的解决方案。

3. 设计贪心选择策略,选择局部最优解。

4. 设计贪心算法的递推或迭代公式。

5. 判断贪心算法是否能够得到全局最优解。

6. 编写程序实现贪心算法。

6.贪心算法是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。

4-贪心法

4-贪心法

应用实例
活动安排问题—算法设计与分析
template<class Type> void GreedySelector(int n, Type s[], Type f[], bool A[]) { A[1] = true; int j = 1; for (int i=2;i<=n;i++) { if (s[i]>=f[j]) { A[i]=true; j=i; } else A[i]=false; } }
贪心法的正确性问题
针对具体问题不同,贪心策略的选择可能有多种 ,如何选择合适的贪心策略并证明该策略的正确 性是贪心算法设计中的一个关键问题。 一般可以通过对算法步数的归纳或通过对问题规 模的归纳来证明贪心法的正确性。
应用实例
活动安排问题
有n个活动申请使用同一个礼堂,每项活动有一个开始时间和一 个截止时间,如果任何两个活动不能同时举行,问如何选择这 些活动,从而使得被安排的活动数量达到最多? 设S={1, 2, …, n}为活动的集合,si和fi分别为活动i的开始和截止 时间,i=1, 2, …, n。定义 活动i与j相容:si ≥ fj或sj ≥fi, i≠j 求S最大的两两相容的活动子集。 蛮力法 动态规划方法
若硬币的面值改为一角一分、五分和一分,要找给顾客的 是一角五分,情况如何?
贪心算法的基本思想
顾名思义,贪心算法总是作出在当前看来最好的 选择。也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优选 择。 贪心算法不能对所有问题都得到整体最优解,但 对许多问题它能产生整体最优解。 在一些情况下,即使贪心算法不能得到整体最优 解,其最终结果却是最优解的很好近似。
4—贪心法 Greedy Approach

算法设计与分析第04章 贪心算法PPT课件

算法设计与分析第04章 贪心算法PPT课件
9
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。

算法分析与设计实验三贪心算法

算法分析与设计实验三贪心算法

实验三贪心算法实验目的1. 掌握贪心法的基本思想方法;2. 了解适用于用贪心法求解的问题类型,并能设计相应贪心法算法;3. 掌握贪心算法复杂性分析方法分析问题复杂性。

预习与实验要求1. 预习实验指导书及教材的有关内容,掌握贪心法的基本思想;2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3. 认真听讲,服从安排,独立思考并完成实验。

实验设备与器材硬件:PC机软件:C++或Java等编程环境实验原理有一类问题是要从所有的允许解中求出最优解,其策略之一是“贪心法”,即逐次实施“贪心选择”:在每个选择步骤上做出的选择都是当前状态下最优的。

贪心选择依赖于在此之前所做出的选择,但不依赖于后续步骤所需要的选择,即不依赖于后续待求解子问题。

显然,这种选择方法是局部最优的,但不是从问题求解的整体考虑进行选择,因此不能保证最后所得一定是最优解。

贪心法是求解问题的一种有效方法,所得到的结果如果不是最优的,通常也是近似最优的。

实验内容以下几个问题选做一项:1. 用贪心法实现带有期限作业排序的快速算法应用贪心设计策略来解决操作系统中单机、无资源约束且每个作业可在等量时间内完成的作业调度问题。

假定只能在一台机器上处理N个作业,每个作业均可在单位时间内完成;又假定每个作业i都有一个截止期限di>0(它是整数),当且仅当作业i在它的期限截止以前被完成时,则获得pi的效益。

这个问题的一个可行解是这N个作业的一个子集合J,J中的每个作业都能在各自的截止期限之前完成。

可行解的效益值是J中这些作业的效益之和,即Σp。

具有最大效益值的可行解就是最优解。

2. 实现K元归并树贪心算法两个分别包含n个和m个记录的已分类文件可以在O(n+m)时间内归并在一起而得到一个分类文件。

当要把两个以上的已分类文件归并在一起时,可以通过成对地重复归并已分类的文件来完成。

例如:假定X1,X2,X3,X4是要归并的文件,则可以首先把X1和X2归并成文件Y1,然后将Y1和X3归并成Y2,最后将Y2和X4归并,从而得到想要的分类文件;也可以先把X1和X2归并成Y1,然后将X3和X4归并成Y2,最后归并Y1和Y2而得到想要的分类文件。

c++贪心算法经典例题

c++贪心算法经典例题

c++贪心算法经典例题和详解贪心算法(Greedy Algorithm)是一种优化问题解决方法,其基本思想是每一步都选择当前状态下的最优解,以期望达到全局最优解。

贪心算法的特点是每一步都要做出一个局部最优的选择,而这些局部最优选择最终构成了全局最优解。

下面是一个经典的贪心算法例题以及详解:例题:活动选择问题(Activity Selection Problem)假设有一个需要在同一时段使用同一个资源的活动集合,每个活动都有一个开始时间和结束时间。

设计一个算法,使得能够安排最多数量的互不相交的活动。

# 输入:-活动的开始时间数组`start[]`。

-活动的结束时间数组`end[]`。

# 输出:-选择的互不相交的活动的最大数量。

# 算法详解:1. 首先,将活动按照结束时间从小到大排序。

2. 选择第一个活动,并将其加入最终选择的集合中。

3. 对于剩下的活动,选择下一个结束时间最早且与前一个活动不冲突的活动。

4. 重复步骤3,直到所有活动都被选择。

```cpp#include <iostream>#include <algorithm>#include <vector>using namespace std;// 定义活动结构体struct Activity {int start, end;};// 比较函数,用于排序bool compareActivities(Activity a, Activity b) {return a.end < b.end;}// 贪心算法解决活动选择问题void activitySelection(vector<Activity>& activities) {// 按照结束时间排序sort(activities.begin(), activities.end(), compareActivities);// 第一个活动总是被选中cout << "Selected activity: (" << activities[0].start << ", " << activities[0].end << ")" << endl;// 选择其余活动int lastSelected = 0;for (int i = 1; i < activities.size(); i++) {// 如果当前活动的开始时间大于等于上一个选择的活动的结束时间,则选择该活动if (activities[i].start >= activities[lastSelected].end) {cout << "Selected activity: (" << activities[i].start << ", " << activities[i].end << ")" << endl;lastSelected = i;}}}int main() {vector<Activity> activities = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}};cout << "Activities before sorting:" << endl;for (const Activity& activity : activities) {cout << "(" << activity.start << ", " << activity.end << ") ";}cout << endl;activitySelection(activities);return 0;}```在这个例子中,我们首先定义了一个活动的结构体`Activity`,然后编写了一个比较函数`compareActivities` 用于排序。

贪心算法PPT课件

贪心算法PPT课件
且有||B’-{k}||>||B-{1}||,这与假设2°矛盾。 ▌
安排方案
f1
B
安排方案
fk
B’
…… 共j个活动
可能 相同 不存在
……
可能
如果 B’包 含这 个活, 则B 一定 包含
9
(2) 时间复杂度分析: 因为排序过程可以在O(nlogn)时间内完成,而求最优活动子 集的过程只需O(n)次比较,因此这个算法的时间复杂度为 O(nlogn)。 (3) 贪心策略设计算法的一般特点
·选Si最小的,这样可以增大场地的利用率; ·选fi最小的,使得下一个活动可以更早开始。
由于活动的占用时间长度没有限制,因此后一选择更合理。
6
为了在每一次选择时取当前可以安排的活动中最早结束的活动,应首先把 n项活动按结束时间的先后进行升序排序。即,使f1≤f2≤…≤fn,然后在Si值 不小于当前时刻的活动中取fi值最小者。 算法:
·算法的设计比较简单; ·算法一般比较快速; ·算法的正确性一般不明显,需要论证;如果正确性不能保 证,那么它往往可以得到近似最优解。
10
5.2 背包(Knapsack)问题
1. 问题描述
已知:n个(应为n种)物体{1,2,…,n}与一个背包。物体i的重量 (或体积)为Wi>0,价值为Pi>0(i=1,2,…,n),背包容量为 M>0。
计算机算法 ——设计与分析导论
刘璟
1
Chapter 5. 贪心(Greedy)技术
❖ 5.1 贪心策略的思想 ❖ 5.2 背包(Knapsack)问题 ❖ 5.3 Huffman编码 ❖ 5.4 多机调度问题的近似解法 ❖ 5.5 单源最短路径的Dijkstra算法

计算机算法设计与分析 王晓东第 版

计算机算法设计与分析 王晓东第 版

School of Computer and Communication Engineer
19

Fun Time
考虑如下活动集合 S:
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 子集 {a3, a9, a11} 为一相容活动集合 • 计算最大相容活动集合?
最优解.
School of Computer and Communication Engineer
14
0/1 背包问题动态规划求解
• 贪心选择无法保证最终能将背包装满, 部分闲置的背 包空间使物品单位重量的价值发生变化
• 应比较选择该物品和不选择该物品所导致的最终方 案, 然后再作出最好选择(重叠子问题)
为了选择最多的相容活动, 每次选择 fi 最小的相容活 动, 即, 使以后可选更多的活动—“贪心(Greedy)”.
School of Computer and Communication Engineer
26
活动选择问题贪心算法
考虑如下活动集合 S: i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 贪心算法: 每一步做出一个选择, 该选择不依赖于子 问题的解
* 一个问题是否具有贪心选择性需要证明
School of Computer and Communication Engineer
7
最优子结构
定义 2. 若一个优化问题的最优解包括它的子问题的最 优解, 则称其具有最优子结构. • 动态规划: 最优子结构, 子问题重叠性 • 贪心算法: 最优子结构, 贪心选择性

(算法分析与设计)2.贪心算法

(算法分析与设计)2.贪心算法

n
wixi
vixi
28.2
31
31.5
...
i1
[算法思路]1).将各物体按单位价值由高到低排序.
2).取价值最高者放入背包.
3).计算背包剩余空间.
4).在剩余物体中取价值最高者放入背包.
若背包剩余容量=0或物体全部装入背包为止
算法设计与分析 > 贪心算法
背包问题的贪心算法
print tour, cost }
*该算法不能求得最优解. 算法的最坏时间复杂性为O(n2)
该问题为NP难问题.
算法设计与分析 > 贪心算法
4.7 多机调度问题
问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工 处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上 加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小 的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽 可能短的时间内 由m台机器加工处理完成。 该问题为NP完全问题.
A complete tree is filled from the left: • all the leaves are on • the same level or • two adjacent ones and • all nodes at the lowest level are as far to the left as possible.
最大相容活动子集(1, 4, 8, 11), 也可表示为等长n元数组:(1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
算法设计与分析 > 贪心算法
活动安排问题贪心算法
template< class Type > void GreedySelector(int n, Type s[ ], Type f[ ], bool A[] ) { A[ 1 ] = true;

贪心算法解决活动安排问题报告

贪心算法解决活动安排问题报告

贪心算法解决活动安排问题金潇Use the greedy algorithm to solve the arrangement for activitiesJinxiao摘要:贪心算法在当前来看是最好的选择。

是用利用启发式策略,在不从整体最优上加以考虑的情况下,来做出局部最优选择的一种算法。

本文通过贪心算法的经典案例—活动安排问题入手,描述了贪心算法的基本思想和可能产生的问题,并简述该算法的好处和特点,最后给出几种经典的贪心算法。

关键字:贪心算法、局部最优选择Abstract:A greedy algorithm is any algorithm that follows the problem solving heuristic of making the locally optimal choice at each stage with the hope of finding the global optimum. This article through the greedy algorithm of the classic case--activities problems, describes the greedy algorithm the basic ideas and possible problems, and briefly introduces the advantages and characteristics of the algorithm, and finally gives several classic the greedy algorithm. Keywords:greedy algorithm、the locally optimal choice1.引言:贪心法是一种改进了的分级处理方法。

用贪心法设计算法的特点是一步一步地进行,每一步上都要保证能获得局部最优解。

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题
1. 零钱兑换问题:给定一些面值不同的硬币和一个金额,要求用最少的硬币凑出这个金额。

2. 最小生成树问题:给定一个无向带权图,要求用最小的权值构建一棵生成树。

3. 背包问题:给定一些物品和一个背包,每个物品有对应的价值和重量,要求在背包容量限制下,选取物品使得总价值最大。

4. 活动安排问题:有若干个活动需要分配一段时间,每个活动有对应的开始时间和结束时间,要求选取尽可能多的活动,使得任两个安排的活动时间不重叠。

5. 单源最短路径问题:给定一个有向带权图和一个起始节点,要求求出从起始节点到其他所有节点的最短路径。

6. 任务调度问题:有若干个需要完成的任务和多个可执行任务的处理器,要求将任务分配给处理器,使得执行总时间最小。

7. 区间覆盖问题:给定一些区间,要求用尽可能少的区间覆盖整个线段。

8. 哈夫曼编码问题:给定一些字符及其对应的出现概率,要求用最短的编码方式表示这些字符。

算法设计与分析-第8章贪心算法

算法设计与分析-第8章贪心算法

贪心算法
一. 贪心法的基本原理
2. 贪心法的基本思想
贪心算法的几个经典例子: Dijkstra算法:求有向图的单源最短路径(8.2) Kruskal算法:求最小生成树 (8.3) Prim算法:求最小生成树 (8.4)
Huffman树、Huffman编码的算法 (8.5)
贪心算法
一. 贪心法的基本原理
贪心算法
二. 贪心算法设计示例
3. Huffman树 Huffman编码
例:字符集{A, B, C, D, E, F, G, H} , 频数:5, 29, 7, 8, 14, 23, 3, 11.
贪心算法
二. 贪心算法设计示例
4. 最小生成树(Prim算法)
有关概念: 生成树:设G=(V, E)为连通图,G的生成树是G的包含 其所有顶点的极小连通子图(这里极小的含义是包含的边最 少) 。 一个连通图的生成树不一定唯一。 含n个顶点的连通图的生成树恰含n-1条边。 最小生成树:设G=(V, E)为连通网,G的最小代价的生 成树称为G的最小生成树。
贪心算法
一. 贪心法的基本原理
2. 贪心法和动态规划
贪心法:每一步的选择不依赖于其子问题的解, 选择是局部最优的,但不能保证最终得到最优 解。
动态规划:问题的解依赖于其子问题的解,选 择是全局最优的,可保证最终得到最优解。
贪心算法
二. 贪心算法设计示例
1. 分数背包问题
问题描述:设有一个容量为 C的背包, n个物品
贪心算法
二. 贪心算法设计示例
6. 多机调度问题 该问题的判定问题是一个NP完全问题,该问 题本身是一个NP难问题,目前还未找到有效的
算法,但用贪心算法可得到较好的近似最优解。

《计算机算法设计与分析》PPT第四章贪心算法资料

《计算机算法设计与分析》PPT第四章贪心算法资料
11
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架

马丙鹏_计算机算法设计与分析_第四章_1

马丙鹏_计算机算法设计与分析_第四章_1

17
4.2 背包问题
1. 问题的描述
– 问题的形式描述 可行解: 满足上述约束条件的任一集合(x1,x2,…,xn) 都是 问题的一个可行解——可行解可能为多个。 (x1,x2,…,xn)称为问题的一个解向量。 最优解: 能够使目标函数取最大值的可行解是问题的最 优解——最优解也可能为多个。
20
20
4.2 背包问题
2. 贪心策略求解
– (1) 以目标函数作为度量标准 如:若ΔM=2,背包外还剩两件物品i,j,且有(pi= 4,wi=4) 和(pj=3,wj=2),则下一步应选择j而非i 放入背包:pi/2 = 2 < pj= 3 实例分析(例4.1) (p1,p2,p3) = (25,24,15), (w1,w2,w3) = (18,15,10) ∵ p1>p2> p3 ∴ 首先将物品1放入背包,此时x1=1,背包获得p1=25的效 益增量,同时背包容量减少w1=18个单位,剩余空间ΔM=2。 其次考虑物品2和3。就ΔM=2而言有,只能选择物品2或3 的一部分装入背包。
3. 贪心方法的一般策略
– 贪心方法
A(1) A(2) … A(n)
量度标准1
A1(1) … A1(n)
量度标准2
A2(1) … A2(n)
……
量度标准k
Ak(1) … Ak(n)
可行解1 次优解
可行解2 最优解
可行解k 次优解
12
12
4.1 一般方法
按照度量标准,从A中选择一个输 procedure GREEDY(A,n) 入,其值赋予x,并将之从A中删除 //A(1:n)包含n个输入// solution←Φ //将解向量solution初始化为空// for i←1 to n do 判断x是否可以包含在解向量中 x←SELECT(A) if FEASIBLE(solution, x) then solution←UNION(solution, x) endif repeat return (solution) 将x和当前的解向量合并成新 end GREEDY 的解向量,并修改目标函数

[C++]贪心算法之活动安排、背包问题

[C++]贪心算法之活动安排、背包问题

[C++]贪⼼算法之活动安排、背包问题⼀、贪⼼算法的基本思想 在求解过程中,依据某种贪⼼标准,从问题的初始状态出发,直接去求每⼀步的最优解,通过若⼲次的贪⼼选择,最终得出整个问题的最优解。

从贪⼼算法的定义可以看出,贪⼼算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,⽽由问题⾃⾝的特性决定了该题运⽤贪⼼算法可以得到最优解。

如果⼀个问题可以同时⽤⼏种⽅法解决,贪⼼算法应该是最好的选择之⼀。

⼆、贪⼼算法的基本要素 (1)最优⼦结构性质 (2)贪⼼选择性质(局部最优选择)三、贪⼼算法实例 1、活动安排 设有n个活动的集合 E = {1,2,…,n},其中每个活动都要求使⽤同⼀资源,如演讲会场等,⽽在同⼀时间内只有⼀个活动能使⽤这⼀资源。

每个活动 i 都有⼀个要求使⽤该资源的起始时间 s i和⼀个结束时间 f i,且 s i< f i。

如果选择了活动i,则它在半开时间区间 [s i ,f i ) 内占⽤资源。

若区间 [s i , f i )与区间 [s j, f j ) 不相交,则称活动i与活动j是相容的。

当 s i ≥ f j或 s j ≥ f i时,活动 i 与活动 j 相容。

活动安排问题就是在所给的活动集合中选出最⼤的相容活动⼦集合。

例如:1 #include <iostream>2 using namespace std;34 #define NUM 5056 void GreedySelector(int n, int s[], int f[], bool b[])7 {8 b[1]=true; //默认将第⼀个活动先安排9 int j=1; //记录最近⼀次加⼊b中的活动1011 //依次检查活动i是否与当前已选择的活动相容12 for(int i=2;i<=n;i++)13 {14 if (s[i]>=f[j])15 {16 b[i]=true;17 j=i;18 }19 else20 b[i]=false;21 }22 }2324 int main()25 {26 int s[] = {0,1,3,0,5,3,5,6,8,8,2,12}; //存储活动开始时间27 int f[] = {0,4,5,6,7,8,9,10,11,12,13,14}; //存储活动结束时间28 bool b[NUM]; //存储被安排的活动编号29 int n = (sizeof(s) / sizeof(s[0])) - 1;3031 GreedySelector(n, s, f, b);3233 for(int i = 1; i <= n; i++) //输出被安排的活动编号和它的开始时间和结束时间34 {35 if(b[i]) cout << "活动 " << i << " :" << "(" << s[i] << "," << f[i] << ")" <<endl;36 }37 return 0;38 } 2、背包问题 给定⼀个载重量为 M 的背包,考虑 n 个物品,其中第 i 个物品的重量 w i(1 ≤ i ≤ n),价值 v i(1 ≤ i ≤ n),要求把物品装满背包,且使背包内的物品价值最⼤。

《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案一.选择题1、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( A )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法4. 回溯法解旅行售货员问题时的解空间树是( A )。

A、子集树B、排列树C、深度优先生成树D、广度优先生成树5.下列算法中通常以自底向上的方式求解最优解的是( B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法6、衡量一个算法好坏的标准是( C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短7、以下不可以使用分治法求解的是( D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题8. 实现循环赛日程表利用的算法是( A )。

A、分治策略B、动态规划法C、贪心法D、回溯法9.下面不是分支界限法搜索方式的是( D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先10.下列算法中通常以深度优先方式系统搜索问题解的是( D )。

A、备忘录法B、动态规划法C、贪心法D、回溯法11.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法12.哈夫曼编码的贪心算法所需的计算时间为( B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)13.分支限界法解最大团问题时,活结点表的组织形式是( B )。

A、最小堆B、最大堆C、栈D、数组14.最长公共子序列算法利用的算法是( B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法15.实现棋盘覆盖算法利用的算法是( A )。

A、分治法B、动态规划法C、贪心法D、回溯法16.下面是贪心算法的基本要素的是( C )。

A、重叠子问题B、构造最优解C、贪心选择性质D、定义最优解17.回溯法的效率不依赖于下列哪些因素( D )A.满足显约束的值的个数B. 计算约束函数的时间C.计算限界函数的时间D. 确定解空间的时间18.下面哪种函数是回溯法中为避免无效搜索采取的策略( B )A.递归函数 B.剪枝函数 C。

第7章 贪心法-算法设计与分析(第2版)-李春葆-清华大学出版社

第7章 贪心法-算法设计与分析(第2版)-李春葆-清华大学出版社

{ SolutionType x={};
//初始时,解向量不包含任何分量
for (int i=0;i<n;i++)
//执行n步操作
{ SType xi=Select(a);
//从输入a中选择一个当前最好的分量
if (Feasiable(xi))
//判断xi是否包含在当前解中
solution=Union(x,xi); //将xi分量合并形成x
} } }
//求解最大兼容活动子集 //初始化为false //A[1..n]按活动结束时间递增排序 //前一个兼容活动的结束时间 //扫描所有活动 //找到一个兼容活动 //选择A[i]活动 //更新preend值
【算法分析】算法的主要时间花费在排序上,排序时间为
O(nlog2n),所以整个算法的时间复杂度为O(nlog2n)。
问题的最优子结构性质是该问题可用动态规划算法或贪心法求解 的关键特征。
7.1.3 贪心法的一般求解过程
贪心法求解问题的算法框架如下:
SolutionType Greedy(SType a[],int n)
//假设解向量(x0,x1,…,xn-1)类型为SolutionType,其分量为SType类型
//标记选择的活动 //选取的兼容活动个数
void solve() { memset(flag,0,sizeof(flag));
sort(A+1,A+n+1); int preend=0; for (int i=1;i<=n;i++) { if (A[i].b>=preend)
{ flag[i]=true; preend=A[i].e;

算法设计与分析论文(贪心算法)

算法设计与分析论文(贪心算法)
3.1 贪心选择
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪 心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划 算法的主要区别。
贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择 就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否 具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最 优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作 了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法 证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
物品超出背包容量为止。伪代码如下:
public static void DepWePr(double[][] a, double c, int[] ans) { // depend on
// the // weight // and price double[] w = new double[a[0].length]; // the weight of goods System.arraycopy(a[0], 0, w, 0, w.length); // copy the array
贪心算法
——不在贪心中爆发,就在贪心中灭亡 徐晓龙 武汉理工大学计算机科学与技术学院软件 ZY1101 班
摘要
本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分 析贪心算法的具体应用,从而指出其特点和存在问题。 关键字:贪心算法,贪心策略,TSP、0/1 背包
引言
我们用了 13 周的时间学完了《算法设计与分析》这本书。这本书中涵盖了 大量的常见算法,包括蛮力法、分治法、动态规划法、贪心算法等等。我最有印 象的就是贪心算法。贪心算法是一种有合理的数据组织和清晰高效的算法,它简 单有效。下面我们来详细解读一下这个算法。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称:算法设计与分析实验名称:贪心法解活动安排问题任课教师:专业:计算机科学与技术
班级: 20xx 级x班学号:
姓名:完成日期: 20xx年x月xx日
五、实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理,重新完成本次实验内容也是很顺利,在编程方面没有遇到什么困难。

相关文档
最新文档