贪心算法解决活动安排问题研究
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` 用于排序。
JX-算法分析与设计(四)贪心算法-8

问题的形式化描述:
规划目标: max
x
i 1
n
i
n wi xi c 约束条件: i 1 x {0,1},1 i n i
说明: xi=0表示集装箱i不装入,xi=1表示集装箱i 装入
13
贪心算法的基本要素(5)
散装背包问题和0-1背包问题的求解讨论:
1) 贪心算法不能求得0-1背包问题的最优解,因为它无法保 证尽量将背包装满,部分闲臵的背包空间会使每公斤背包空 间的价值降低了。 2) 动态规划算法也可以用于求解散装背包问题,但是效率 要比贪心算法低的多。
14
贪心算法的基本要素(6)
18
最优装载问题(3)
最优装载问题:贪心选择性质的证明。
设:集装箱已按重量从小 到大排序,(x1, x2, …, xn)是一个最优解, k=min{ i | xi=1且1≤i≤n},如果 问题有解,显然有: 1≤k≤n。 1) 当k=1时, (x1, x2, …, xn)是满足贪心选择性质的最优解。 2) 当k>1时,取y1=1,yk=0,yi=xi,1<i ≤n,i ≠ k,则有:
变长码(Variable-length Codeword)存储(Huffman编码): a 频率(千次) 编码 45 0 b 13 101 c 12 100 d 16 111 e 9 1101 f 5 1100
7
证毕(即总存在着以贪心选择开始的最优解)。
活动安排问题(6)
GreedyAcitivitySelector贪心选择的正确性证明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;
贪心算法经典例题

贪心算法经典例题贪心算法是一种求解最优问题的算法思想,其核心理念是每一步都选择当前最优的策略,从而达到全局最优解。
贪心算法可以应用于许多经典问题,下面将介绍几个常见的贪心算法经典例题及相关参考内容。
1. 会议室安排问题题目描述:给定一组会议的开始时间和结束时间,求解如何安排会议,使得尽可能多的会议可以在同一时间段内进行。
解题思路:贪心算法可以通过每次选择结束时间最早的会议来求解。
首先将会议按照结束时间排序,选择第一个会议作为首先安排的会议,然后依次选择后续结束时间不冲突的会议进行安排。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)2. 零钱兑换问题题目描述:给定一定面额的硬币,求解如何用最少的硬币数量兑换指定金额的零钱。
解题思路:贪心算法可以通过每次选择面额最大且不超过目标金额的硬币来求解。
从面额最大的硬币开始,尽可能多地选择当前面额的硬币,并减去已经选择的硬币金额,直到金额为0。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《算法4》第1章:基础(ISBN: 9787302444627)3. 区间调度问题题目描述:给定一组区间,求解如何选择尽可能多的不重叠区间。
解题思路:贪心算法可以通过每次选择结束时间最早的区间来求解。
首先将区间按照结束时间排序,选择第一个区间作为首先选择的区间,然后依次选择后续结束时间不与已经选择的区间重叠的区间进行选择。
相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)4. 分糖果问题题目描述:给定一组孩子和一组糖果,求解如何分配糖果,使得最多的孩子能够得到满足。
解题思路:贪心算法可以通过每次选择糖果最小且能满足当前孩子的糖果来求解。
贪心算法设计及其实际应用研究

哈尔滨师范大学学年论文题目关于贪心算法研究学生***指导教师年级2009级专业计算机科学与技术系别计算机科学与技术学院计算机科学与信息工程学院哈尔滨师范大学年月论文提要为满足人们对大数据量信息处理的渴望,解决各种实际问题,计算机算法学得到了飞速的发展。
设计一个好的求解算法更像是一门艺术而不像是技术。
当一个问题具有最优子结构性质和贪心选择性质时,贪心算法通常会给出一个简单、直观、高效的解法。
贪心算法通过一系列的选择来得到一个问题的解。
它所作的每一个选择都是在当前状态下具有某种意义的最好选择,即贪心选择;并且每次贪心选择都能将问题化简为一个更小的与原问题具有相同形式的子问题。
尽管贪心算法对许多问题不能总是产生整体最优解,但对诸如最短路径问题、最小生成树问题,以及哈夫曼编码问题等具有最优子结构和贪心选择性质的问题却可以获得整体最优解。
而且所给出的算法一般比动态规划算法更加简单、直观和高效。
贪心算法设计及其实际应用研究***摘要:在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。
从贪心算法的定义可以看出,贪心法并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。
贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其它算法相比具有一定的速度优势。
如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。
本文讲述了贪心算法的含义、基本思路及实现过程,贪心算法的核心、基本性质、特点及其存在的问题。
并通过贪心算法的特点举例列出了以往研究过的几个经典问题,对于实际应用中的问题,也希望通过贪心算法的特点来解决。
关键词:贪心算法;哈夫曼编码;最小生成树;多处最优服务次序问题;删数问题一、贪心算法的基本知识概述(一)贪心算法的核心贪心算法的核心问题是选择能产生问题最优解的最优度量标准,即具体的贪心策略。
贪心算法(Greedy)

例如, 例如,设7个独立作业{1,2,3,4,5,6,7}由3台 机器M1,M2和M3加工处理。各作业所需的处理时 间分别为{2,14,4,16,6,5,3}。按算法greedy greedy产生 greedy 的作业调度如下图所示,所需的加工时间为17。
约定,每个作业均可在任何一台机器上加工处理, 约定,每个作业均可在任何一台机器上加工处理,但未 完工前不允许中断处理。作业不能拆分成更小的子作业。 完工前不允许中断处理。作业不能拆分成更小的子作业。
采用最长处理时间作业优先 最长处理时间作业优先的贪心选择策略可以设计 最长处理时间作业优先 出解多机调度问题的较好的近似算法。 按此策略,当 n ≤ m时,只要将机器i的[0, ti]时间区间 分配给作业i即可,算法只需要O(1)时间。 i O(1) 当 n > m 时,首先将n个作业依其所需的处理时间从大 到小排序。然后依此顺序将作业分配给空闲的处理机。算 法所需的计算时间为O(nlogn)。
void Knapsack(int n,float M,float Knapsack(int v[],float w[],float x[]) { Sort(n,v,w); int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break; x[i]=1; c-=w[i]; } if (i<=n) x[i]=c/w[i]; }
用贪心算法解背包问题的基本步骤:
首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心 首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心 选择策略,将尽可能多的单位重量价值最高 选择策略,将尽可能多的单位重量价值最高的物品装入背包。 单位重量价值最高的物品装入背包。 若将这种物品全部装入背包后,背包内的物品总重量未超过 C,则选择单位重量价值次高的物品并尽可能多地装入背包。 依此策略一直地进行下去,直到背包装满为止。 具体算法可描述如下页:
算法分析与设计实验二贪心算法
算法分析与设计实验二贪心算法贪心算法(Greedy Algorithm)是一种常用的算法设计方法,其核心思想是在每一步都做出当前情况下最优选择,以期望最终得到全局最优解。
本实验主要介绍贪心算法的原理、应用和分析。
一、贪心算法的原理贪心算法的基本思路是在每一步都做出当前情况下最优选择,并且不考虑当前选择对后续选择的影响。
贪心算法通常采用贪心选择策略和最优子结构两个基本要素。
1.贪心选择策略贪心选择策略是指在每一步都选择当前情况下最优解的策略。
这种策略要求我们能够证明,通过选择当前最优解,可以使得问题的规模减小到原问题的一个子问题,并且该子问题的最优解一定包含在全局最优解中。
2.最优子结构最优子结构是指问题的最优解包含其子问题的最优解。
贪心算法求解问题的过程通常包括两个步骤,选择最优子结构和利用最优子结构得到最优解。
二、贪心算法的应用1.集合覆盖问题集合覆盖问题是指在给定的一组集合中,找出最小的子集合,使得这些子集合的并集包含所有的元素。
贪心算法可以通过每一步选择包含最多未覆盖元素的集合,直到覆盖所有元素为止。
2.挑选活动问题挑选活动问题是指在给定一组活动的起始时间和结束时间,找出最大的相容活动子集合。
贪心算法可以通过每一步选择结束时间最早的活动,之后将该活动与其他相容的活动进行比较,从而得到最大的相容活动子集合。
3.分数背包问题分数背包问题是指在给定一组物品和一个背包容量的情况下,选择部分物品放入背包,使得放入背包的物品总价值最大。
贪心算法可以通过每一步选择单位重量价值最高的物品,直到背包容量不足为止。
三、贪心算法的分析贪心算法通常具有高效性和近似最优性的特点。
由于贪心算法每一步都选择当前最优解,不进行回溯和剪枝的操作,因此贪心算法的时间复杂度较低。
然而,贪心算法并不总能得到问题的最优解,它通常只能得到近似最优解。
贪心算法的近似性证明可以分为两步。
首先,我们需要证明贪心选择策略的正确性,即每一步选择的最优解一定包含在全局最优解中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无 论 是 三 维 图形 , 量 数 据 处 理 等 都 需 要 极 大 的计 算 量 。 海 在 网络 时 代 , 来 越 多 的 挑 战需 要 靠卓 越 的 算 法 来 解 决 。 越
息 流 量 在 飞快 进 步 , 据 量 更 是 达 到 了 前 所 未 有 的 程 度 。 数
质 量 优 劣 将 影 响 到 算 法 乃 至 程 序 的 效 率 。一 个 算 法 的 评
价 主 要 从 时 间 复 杂 度 和 空 间 复杂 度 来 考 虑 。
2 用 贪 心 算 法 描 述 月 O1 2
Vo . ON O 1 11 2
De . c 20l 1
贪 心 算 法 解 决 活 动 安排 问题研 究
苏方 方 , 金 玲 张
( 西师 范 大学 计算机 信 息 与工程 学 院 , 西 桂 林 5 1 0 ) 广 广 4 0 4
用 资 源 一 直 是 专 家 学 者 研 究 的热 点 问题 。
用 贪 心 算 法 解 决 本 题 的 思 想 是 : 源 足 够 多 , 要 使 资 但
1 贪 心 算 法 以 及 贪 心 算 法 的基 本 要素
贪 心 算 法 是 指 从 问题 的初 始 状 态 出发 , 过若 干 次 的 通 贪 心 选 择 而 得 出最 优 值 ( 较 优 解 ) 一 种 解 题 方 法 。并 或 的 不 是 从 整 体 上 加 以考 虑 , 所 做 出 的选 择 只是 在 某 种 意 义 它
中 图分 类 号 : 3 2 TP 1
文献标识码 : A
文 章 编 号 : 6 27 0 ( 0 1 0 20 4 — 2 1 7 — 8 0 2 1 ) 1 —0 30 另外 , 同一 个 问 题 可 用 不 用 算 法 解 决 , 一 个 算 法 的 而
0 引言
假设 要 在 足 够 多 的会 场 里 安 排 一 批 活动 , 希 望 使 用 并 尽 可 能 少 的 会 场 。这 里 就 需 要 选 用 合 适 的 算 法 来 解 决 类 似 的 问题 。虽 然 计 算 机 的 计 算 能 力 每 年 都 在 飞 快 增 加 , 但 是 , 要 处 理 的信 息 量 更 是 呈 指 数 级 的 增 长 。互 联 网 的信 需
以下 我 们 证 明 该 问 题 具 有贪 心算 法 的两 个 性 质 :
( ) 动 安 排 问题 具 有贪 心 选 择 性 质 1活 证 明 : 先 将 活 动安 排 问题 数 学 化 , 有 n个 活 动 的 首 设 集 合 E一 {1 , , , , 个 活 动 i都 有 一 个 要 求 使 用 2 … n} 每 该 资 源 的起 始 时 问 s 和 一 个 结 束 时 问 f 即 k是 所 需 最 i i。 少 资 源 的个 数 。设 活 动 已 排序 , (A ,A ,… , 是 所 需 A) 要 的 k个 已 安 排 了 活 动 的 资源 。 ① 当 k一 1时 , 就 是 所 有 的 活 动 在 一 个 资 源 里 相 也 容, A1是 满 足 贪 心 选 择 性 质 的 最 优 解 ; 当 k> 一 2时 , ②
取 B 一A , A ( B B 一 即 k是 安 排 了 m 个 活 动 的 一 个 资
源 , 1 m) 活 动 都 安 排 在 B (- 2 个 1到 B一 个 资 源 里 ) k 。就 是 ( m m) 活 动 安 排 需 要 ( 一 1 个 资 源 。则 ( B , , n 个 k ) B , … B ) ( 是 n— m) 活 动 可行 解 。 个
采用循环 语句 , 根据局部最优策略 , 到一个部分解 , 就 得 缩
小 问题 的 范 围 或 规 模 ; 将 所 有 部 分 解 综 合 起 来 , 到 问 ③ 得 题 的最 终 解 。另 外 它 也 是 一 种 某 种 度 量 意 义 下 的 最 优 解 的分 级 处 理 方 法 。 对 于 一 个 具 体 的 问题 , 么 知道 是 否 可 用 贪 心 算 法 来 怎 解 决 问题 , 以及 能 否得 到 问 题 的 一 个 最 优 解 呢 ? 从 许 多 可
用 最 少 的资 源 安 排 全 部 活 动 , 时保 证 每 个 资 源 中安 排 的 同
活 动 集 在 时 间上 不 能 发 生 冲 突 。如 果 第 一 个 资 源 中 尽 可 能 安 排 最 多 的活 动 , 这 个 资 源 得 到 了充 分 的利 用 , 且 则 而 剩 下 的活 动 越 少 , 二 个 资 源 也 尽 可 能 安 排 最 多 的 活 动 , 第 依次类推 。
摘 要 : 利用贪心算 法解 决如何使 用最少的资源安排一 系列 活动。并证 明 了贪 心算 法解 决此问题的有效 性, 且进 行
了实例 验 证 , 并进 行 了复 杂 度 分 析 , 算 法是 解 决 资 源 组 合 规 划 问题 较 好 的 方 法 。 此
关 键 词 : 心算法 ;aa 贪 Jv 程序 ; 杂度 分析 ; 复 活动安排 问题
上 的 局 部 最 优 解 。贪 心 算 法 可 以简 单 描 述 为 : 一 组 数 据 对 进 行 排 序 , 出 最 小 值 , 行 处 理 , 找 出 最 小 值 ,再 处 找 进 再 理 。也 就 是 说 贪 心 算 法 是 一 种 在 每 一 步 选 择 中都 采 取 在
当 前 状 态 下 最 好 或 最 优 的选 择 , 而 希 望 得 到 结 果 是 最 好 从 或 最优的算法 。 贪 心 算 法 解 题 步 骤 : 从 问 题 的某 个 初 始 解 出 发 ; ① ②