第4章贪心算法习题(免费阅读)
第4章 贪心算法
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
应用背景和动机
最优化问题
—— 优化问题和贪心算法
找钱币的贪心算法
例子:有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾 客4元6角现金 目标:找出的货币的数量最少 贪心算法: 多步决策:根据总额,每步确定不超过总额的最大面额货币数(贪
多步决策:每步选择一项活动加入A
(3)把活动按照截止时间从小到大排序,使得f1≤f2≤…≤fn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。
贪心选择策略: (1)把活动按照开始时间从小到大排序,使得s1≤s2≤…≤sn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。 (2)计算每个活动的占用时间,即fi-si,然后,按照占用时间从 小到大对活动排序,使得f1-s1≤f2-s2≤…≤fn-sn,然后从前向后挑 选,只要与前面选的活动相容,就可以把这项活动选入A。
心选择:最快地满足支付要求,其目的是使付出的货币张数最慢地增加),
做出一组选择以达到一个最优解,而不仅仅是一个解
贪心算法
贪心算法通常应用于最优化问题,目标也是获得一个最优解 (不是总能如愿)
总额中减去已找面额获得新的总额(子问题);重复上述过程直到剩 余总额为0。 选择: •选出2元*2,余6角 •选出5角,余1角 •选出1角,余0 •总共付出4张货币
例:
i s[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
最优解:A={1, 4, 8, 11} 总共可安排的最大活动数是4个。 最优解不唯一:A={2, 4, 8, 11}
贪心算法求解问题(优化版)
贪心算法求解问题问题分析:此问题为程序最优存储问题,问题要求最后存储的两个磁带上的长度差异就最小。
若在最优解中去掉i个程序段,显然在(n-i)个程序段的存储中应仍是最优解,因为此问题存在最优子结构。
另外,由于每个程序的长度不同,每将一个程序存储到A或者B(用A和B来表示两个磁带上存储程序的集合)后,显然还与后续怎么存储程序有关,即当前结果依赖子问题的结果。
这正是动态规划算法的基本特征,而贪心算法仅在当前状态下做出最好选择,然后再去做子问题的局部最优解最终就是问题的最优解,贪心算法不依赖于将来所做的子问题的解,显示,此问题是一个动态规划问题,是一个0-1背包问题。
虽然对有些问题,贪心算法并不能得到一个最优解,但往往能快速地得到一个近似最优解。
下面就来讨论如何用贪心算法得到近似最优解。
贪心算法思路为了使最后两个磁带的长度差异越小,就先将长度较大的程序优先放入到磁带(此处用A和B分别表示两个磁带)上。
因此排序选择递减排序。
用p[ ]数组来存放第i个程序长度为p[i-1],首先将其按程序长度大小递减的顺序排序,将排好序的各程序下标记录到与与p[]等长的数组a[ ]中。
然后再根据a[]中记录的下标找到相应的程序p[a[i]]放到A或者B 中。
现在就接下就是如何存放来达到近似最优解的问题了开始A和B中没有任何元素(本程序中采用vector动态定义A,B),如果用sumA和sumB来标记A和B中已存入程序的总长度,在存入当前最优解时,先比较sumA和sumB 的大小,将最优解存入到程序总长度较短的那个程序集合,如果长度一样,则存入到A或者B中(本程序是存入到A集合中),可以看到这样存入的话,就会尽量减小A和B长度的差异,从而尽量接近最优存储得到近似最优解之前提交的贪心算法的思想是直接交叉存入到A和B中,那样得到的解在一定程度能得利近似最优解,那种思想只对程序段长度相差小的情况有比较好的结果,因为那种思想大概是将程序段平均到A和B中,在很多情况下不能得到近似最优解。
贪心算法练习题
贪心算法1.喷水装置(一)描述现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
输入第一行m表示有m组测试数据每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
输出输出所用装置的个数样例输入252 3.2 4 4.5 6101 2 3 1 2 1.2 3 1.1 1 2样例输出25根据日常生活知道,选择半径越大的装置,所用的数目越少。
因此,可以先对半径排序,然后选择半径大的。
另外,当装置刚好喷到矩形的顶点时,数目最少。
此时只要装置的有效喷水距离的和不小于20时,输出此时的装置数目即可。
2.喷水装置(二)时间限制:3000 ms | 内存限制:65535 KB难度:4描述有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。
请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行样例输入221 1010 1131 1010 1111 20样例输出12提示注意:如果上一个活动在T时间结束,下一个活动最早应该在T+1时间开始。
解题思路:这是一个贪心法中选择不相交区间的问题。
先对活动结束时间从小到大排序,排序的同时活动的起始时间也要跟着变化。
而且,结束时间最小的活动一定会安排,不然这段时间就白白浪费了。
后一个活动的起始时间如果比前一个活动的结束时间大,即两个活动没有相交时间,就把这个活动也安排上。
贪心算法经典例题
贪心算法经典例题引言贪心算法是一种常见的算法策略,它在求解问题时每一步都选择当前状态下的最优解,从而最终得到全局最优解。
本文将介绍一些经典的贪心算法例题,帮助读者更好地理解贪心算法的思想和应用。
背景知识在讨论贪心算法之前,我们先了解一些背景知识。
1. 贪心算法的特点贪心算法具有以下特点: - 每一步都选择当前状态下的最优解; - 不进行回溯;- 不保证能得到全局最优解,但通常能得到较优解; - 算法运行效率高。
2. 贪心算法的适用情况贪心算法适用于满足以下条件的问题: - 具有最优子结构性质:问题的最优解包含子问题的最优解; - 贪心选择性质:局部最优解能导致全局最优解; - 没有后效性:当前的选择不会影响后续的选择。
经典例题1:找零钱问题问题描述假设有1元、5元、10元、20元、50元、100元面值的纸币,如何用最少的纸币数量找零给顾客?对于找零问题,贪心算法可以得到最优解。
具体步骤如下: 1. 首先,我们选择最大面额的纸币进行找零。
2. 然后,将选择的纸币数量减去顾客需找的金额,得到剩余金额。
3. 重复步骤1和步骤2,直到剩余金额为0。
实现代码int[] denominations = {100, 50, 20, 10, 5, 1};int[] counts = new int[denominations.length];int amount = 168;for (int i = 0; i < denominations.length; i++) {counts[i] = amount / denominations[i];amount %= denominations[i];}System.out.println("找零纸币面额及数量:");for (int i = 0; i < denominations.length; i++) {if (counts[i] > 0) {System.out.println(denominations[i] + "元:" + counts[i] + "张");}}分析与总结通过贪心算法,我们可以得到找零纸币的最优解。
江西科学技术版小学信息技术五年级下册《主题活动:贪心算法》同步练习题附知识点归纳
江西科学技术版小学信息技术五年级下册《主题活动:贪心算法》同步练习题附知识点归纳一、课文知识点归纳:1. 贪心算法的基本概念:(1)贪心算法是一种求解最优解问题的更简单、更迅速的设计技术。
(2)它以当前情况为基础,根据某个优化测度做出最优选择,而不考虑所有可能的整体情况。
(3)贪心算法通过自顶向下、迭代的方法做出相继的贪心选择,每做一次选择,问题就简化为一个规模更小的子问题。
2. 贪心算法的基本要素:(1)贪心选择性质:整体最优解可通过一系列局部最优解的选择达到,且每次选择不依赖于后续选择。
(2)最优子结构性质:问题的最优解包含其子问题的最优解。
3.贪心算法的步骤:(1)建立数学模型来描述问题。
(2)把求解的问题分成若干个子问题。
(3)对每个子问题求解,得到子问题的局部最优解。
(4)将子问题的局部最优解合成原问题的解。
4.贪心算法的特点:(1)简单易实现,计算效率高。
(2)适用于具有贪心选择性质和最优子结构性质的问题。
(3)得到的解通常是某种意义上的局部最优解,但不一定是全局最优解。
5.贪心算法的应用场景:(1)货币兑换问题(如找零钱问题)。
(2)背包问题(在限制条件下选择最大价值的物品)。
(3)活动选择问题(安排一系列活动使得尽可能多的活动被安排)。
二、同步练习题。
(一)、填空题。
1. 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优__________的选择,从而希望导致结果是全局最好或最优的算法。
2. 在解决背包问题时,如果背包容量为20千克,物品A重5千克价值100元,物品B重10千克价值150元,为了价值最大化,应先放入____________千克的物品。
3. 在活动选择问题中,若有多个活动的时间区间存在冲突,我们通常使用____________算法进行筛选。
(二)、选择题。
1. 下列关于贪心算法的说法,正确的是()。
A. 贪心算法总是能得到全局最优解B. 贪心算法是一种启发式搜索算法C. 贪心算法只适用于特定类型的问题D. 贪心算法不需要考虑问题的整体结构2. 在教室调度问题中,若某间教室在某天的课程安排如下:课程A 9:00-10:00,课程B 9:30-10:30,课程C 10:30-11:30,则能在这间教室连续进行的课程是()。
贪心法例题
贪心法3.1 排队接水有n 个人在一个水龙头前排队接水,假如每个人接水的时间为T i ,请编程找出这n 个人排队的一种顺序,使得n 个人的平均等待时间最小。
【输入】输入文件共两行,第一行为n ;第二行分别表示第1个人到第n 个人每人的接水时间T 1,T 2,…,T n ,每个数据之间有1个空格。
【输出】输出文件有两行,第一行为一种排队顺序,即1到n 的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
【样例】 water.in water.out 10 3 2 7 8 1 4 9 6 10 5 56 12 1 99 1000 234 33 55 99 812 291.90 【算法分析】 平均等待时间是每个人的等待时间之和再除以n ,因为n 是一个常数,所以等待时间之和最小,也就是平均等待时间最小。
假设是按照1~n 的自然顺序排列的,则这个问题就是求以下公式的最小值:∑∑==⎪⎪⎭⎫⎝⎛=+⋯⋯+++⋯⋯++++++=ni i j j n T T T T T T T T T T total 1121321211)()()(如果用穷举的方法求解,就需要我们产生n 个人的所有不同排列,然后计算每种排列所需要等待的时间之和,再“打擂台”得到最小值,但这种方法需要进行n!次求和以及判断,时间复杂度很差! 其实,我们认真研究一下上面的公式,发现可以改写成如下形式:∑=--+=++⋯⋯+-+-+=ni i n n T i n T T T n T n nT total 11321)1(2)2()1(这个公式何时取最小值呢?对于任意一种排列k 1, k 2, k 3, …, k n ,当1k T ≤2k T ≤3k T ≤…≤n k T 时,total取到最小值。
如何证明呢?方法如下: 因为n j i k k k k k T T j n T i n T n nT total +⋯++-+⋯++-+⋯+-+=)1()1()1(21假设i <j ,而i k T <j k T ,这是的和为total 1,而把k i 和kj 互换位置,设新的和为total 2,则:))(())(1())(1())1()1(()1()1(12i j i j i j j i i j k k k k k k k k k k T T i j T T j n T T i n T j n T i n T j n T i n total total total --=-+---+-=+-++--+-++-=-=∆我们发现上述△total 恒大于0,所以也说明了任何次序的改变,都会导致等待时间的增加。
算法设计与分析第4章贪心算法
•
for (i=0;i<n;i++) {
•
if (d[i].w>c) break;
•
x[d[i].i]=1;
•
opt+=d[i].v;
算时间上界为 O(nlogn)。当然, 为了证明算法的正确
•
c-=d[i].w;
性,还必须证明背包
•
}
•
if (i<n){
•
x[d[i].i]=c/d[i].w;
问题具有贪心选择性 质。
动态规划算法通常以自底向上的方式解各子问题,而 贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求 问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质 ,必须证明每一步所作的贪心选择最终导致问题的整 体最优解。
14
4.2 贪心算法的基本要素
•
opt+=d[i].w;
•
c -= d[i].w;
•
}
•
return opt;
其中Element类说明为 参见本书P115
•}
23
4.3 最优装载
2.贪心选择性质
可以证明最优装载问题具有贪心选择性质。
3.最优子结构性质
最优装载问题具有最优子结构性质。
由最优装载问题的贪心选择性质和最优子结构性 质,容易证明算法loading的正确性。
7
4.1 活动安排问题
在下面所给出的解活动安排问题的贪心算法greedySelector :
• public static int greedySelector(int [] s, int [] f, boolean a[])
贪心算法例题简单说明
贪⼼算法例题简单说明
1.选择不相交区间问题
贪⼼思路:按照结束时间的顺序排序,结束时间越早,后⾯就能放越多的事。
2.区间选点问题
贪⼼思路:从前往后扫每个区间的树⽊,数⽬的那个区间,从后往前种树。
3.区间覆盖问题
贪⼼思路:预处理完了之后,要找到右端点坐标最⼤的⼀个,直到到边。
这⾥我就要说⼀下了⼀定要注意上下的边界问题:
1.两个圆相切肯定不对,覆盖不全
2.覆盖圆与边相切也不对,覆盖不全
4.流⽔作业调度问题
贪⼼思路:
5.带期限和带罚款的单位时间任务调度
贪⼼思路:罚款越⼤,越要完成,所以罚款⼤的要先处理,将罚款⼤的放在能放区间的最后。
算法分析习题参考答案第四章
第四章作业 部分参考答案1. 设有n 个顾客同时等待一项服务。
顾客i 需要的服务时间为n i t i ≤≤1,。
应该如何安排n 个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。
试给出你的做法的理由(证明)。
策略:对 1i t i n ≤≤进行排序,,21n i i i t t t ≤≤≤ 然后按照递增顺序依次服务12,,...,ni i i 即可。
解析:设得到服务的顾客的顺序为12,,...,n j j j ,则总等待时间为,2)1(121n n j j j j t t t n nt T +++-+=- 则在总等待时间T 中1j t 的权重最大,jn t 的权重最小。
故让所需时间少的顾客先得到服务可以减少总等待时间。
证明:设,21n i i i t t t ≤≤≤ ,下证明当按照不减顺序依次服务时,为最优策略。
记按照n i i i 21次序服务时,等待时间为T ,下证明任意互换两者的次序,T都不减。
即假设互换j i ,)(j i <两位顾客的次序,互换后等待总时间为T ~,则有.~T T ≥由于,))(())(()2)(2()1)(1(21n j i i i i i i t j t j n i t i n t n t n T +--++--++--+--=,))(())(()2)(2()1)(1(~21n i j i i i i i t j t j n i t i n t n t n T +--++--++--+--=则有.0))((~≥--=-i j i i t t i j T T同理可证其它次序,都可以由n i i i 21经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而n i i i 21为最优策略。
2. 字符h a ~出现的频率分布恰好是前8个Fibonacci 数,它们的Huffman 编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情形。
第4章 贪心算法-2.
} } //时间复杂性:O(n) (不包括排序)
2020年7月9日星期四
第4章 贪心算法
5
[算法思路]将n个活动按结束时间非减序排列,依 次考虑活动i, 若i与已选择的活动相容, 则添加此 活动到相容活动子集.
2020年7月9日星期四
第4章 贪心算法
3
4.2 活动安排问题
问题的提出
n个活动的集合E={1,2,…,n},在某一时间内要独占 使用某个资源。每个活动i使用资源的起始时间为 Si,终止时间为Fi。 活动i和活动j相容:是指[Si,Fi)与[Sj,Fj)不相交, 即:Sj>=Fi 或Si>=Fj
贪心策略:重量轻的集装箱,优先装载。
2020年7月9日星期四
第4章 贪心算法
11
算法说明: 时间复杂性:排序 O(nlogn)
数组X:存放最优解。起初,xi =0 数组W:存放各个集装箱重量。 Sort(W,t,n):t[i]存放W中第i小元素的位置 例:W={15, 9, 7, 20, 8}
1
贪心法与动态规划法的比较
贪心法:当前状态下,局部最优选择,然后求解作 出此选择之后的子问题。贪心选择依赖于以往作出 的选择,但不受将来所作的选择的影响,既不依赖 于以后子问题的解。
动态规划法:每步所做的选择依赖于相关子问题的 解,只有在解出相关子问题以后,才能作出选择。
如何证明一个问题具有贪心选择性质?
i= 1 2 3 4
5
t[i]= 3 5 2 1
贪心算法练习题
贪心算法练习题贪心算法1.喷水装置(一)描述现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
输入第一行m表示有m组测试数据每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
输出输出所用装置的个数样例输入252 3.2 4 4.5 6101 2 3 1 2 1.2 3 1.1 1 2样例输出25根据日常生活知道,选择半径越大的装置,所用的数目越少。
因此,可以先对半径排序,然后选择半径大的。
另外,当装置刚好喷到矩形的顶点时,数目最少。
此时只要装置的有效喷水距离的和不小于20时,输出此时的装置数目即可。
2.喷水装置(二)时间限制:3000 ms | 内存限制:65535 KB难度:4描述有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。
请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
输出每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。
样例输入22 8 61 14 52 10 64 56 5样例输出123.会场安排问题描述学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。
《计算机算法设计与分析》PPT第四章贪心算法资料
假设活动已按结束时间的单调非递减顺序排序 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
贪心算法的一般框架
第4章贪心算法1例子
4.7 多机调度问题
特别地,对m=1时, 1)若n个作业都必须完成,如何调度? 2)若在时间t内,使得尽可能多的任务
完成,如何调度?
解答:
1)n个作业都必须完成,完成时间是确 定的,无所谓调度,谁先谁后都可 以。
2)若在时间t内,使得尽可能多的任务
完成,应短作业优先。
36
贪心法小结
37
贪心法 正确性证明
4.3 最优装载
有一批集装箱要装上一艘载重量为c的轮船。其 中集装箱i的重量为Wi。最优装载问题要求确定在 装载体积不受限制的情况下,将尽可能多的集装箱 装上轮船。
1、算法描述 最优装载问题可用贪心算法求解。采用重量最
轻者先装的贪心选择策略,可产生最优装载问题的 最优解。具体算法描述如下页。
1
4.3 最优装载
33
4.7 多机调度问题
例如,设7个独立作业{1,2,3,4,5,6,7}由3台 机器M1,M2和M3加工处理。各作业所需的处理时 间分别为{2,14,4,16,6,5,3}。按算法greedy产生 的作业调度如下图所示,所需的加工时间为17。
34
4.7 多机调度问题
再看一例:: N={10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 5}, m=3
并”运算后产生最终所要求的树T。
10
4.4 哈夫曼编码
11
4.4 哈夫曼编码
12
4.4 哈夫曼编码
在书上给出的算法huffmanTree中: 每一字符c的频率是f(c); 以f为键值的优先队列Q采用最小堆实现; 用贪心选择当前要合并的2棵具有最小频率的树; 一旦2棵具有最小频率的树合并后,产生一棵新的树,
第4章 贪心算法_作业
对每个j = 1, 2, …, m,有xp ≥xq
j m m
j
• 由上述命题(已证明),推出xp ≥ xq 式①。 • 现在m < k,那么一定有: xp < L – d 式② ,否则旅行者不 m 必停在xp 。
m+1
• 把两式组合可得: xq < L – d ;但这与假设S是一个有效的 m 停止点集合相矛盾。
前8个Fibonacci数为: 1, 1, 2, 3, 5, 8, 13, 21, ……
54 • 则a, b, c, d, e, f, g, h这 8个字符出现的次数依 次为:1, 1, 2, 3, 5, 8, 13, 21次。 0 33 0
1
21
20
0 8 0 5 0 3 1 12
1
13
• 以此构造一颗 Huffman树(不唯一) 如右:
• 从而,不可能有m < k,即存在一个更小的停止点的有效集 合(较小的集合)S = { xq , …, xq }的假设是不成立的!
1 m
• 所以贪心算法产生一个最小的有效停止点集合得证!
End
课后练习:算法分析题
• 算法分析题4-6(教材第128页):字符a~h出现 的频率恰好是前8个Fibonacci数,它们的哈夫曼 编码是什么? • 解答: Fibonacci数列
1 F n 1 F n 1 F n 2 n 0 n 1 n1
课后练习
• 设R = { xp , …, xp }表示由贪心算法选择的停止点的集合, 1 k 根据反证法,假设存在一个更小的停止点的有效集合: 把这个较小的集合称为S = { xq , …, xq },显然此时m< 1 m k。
贪心算法(4):作业排序问题
贪⼼算法(4):作业排序问题上⼀堂课程,我们学习了如何选择活动,使得在不发⽣冲突的前提下,能参与尽可能多的活动,这⾥没有考虑到不同的活动是否会带来不同的收益,假设它们的收益是⼀样的。
现在我们把问题修改下:有⼀系列作业,每个作业必须在各⾃的截⽌时间点之前完成,并且已知完成每个⼯作需要花费的时间以及带来的收益。
为了简单起见,假设完成每个⼯作都需要相等的单位时间,这样作业的截⾄时间点也就是单位时间的倍数。
再假设⼀次只能安排⼀个作业,完成⼀个作业后才能继续下⼀个作业。
问:如何选择作业并安排次序使它们能带来的总收益为最⼤?我们⽤例⼦A来说明。
【输⼊】有4个作业a,b,c,d。
它们各⾃的截⽌时间和能带来的收益如下:【输出】请找出⼀种能带来最⼤收益的作业执⾏次序。
在例⼦中,下列作业次序能带来最⼤的收益:{c, a}完成作业c,能带来的收益是40;因为做作业c,截⽌时间为1,它必须安排在0-1之间执⾏。
这样已经错过了b或d的截⽌时间点(1),因此⽆法再选择b或d,只能选择作业a,a的截⾄时间点为4,来得及完成。
做作业a的收益是20,因此完成作业c和a能带来的总收益是 40+20=60。
⽽选择其他次序的作业,都⽆法超过收益60。
参见下⾯的动图:我们再看⼀个例⼦B【输⼊】有5个作业a,b,c,d,e。
它们各⾃的截⽌时间和能带来的收益如下:请你选择和安排能获取最⼤收益的作业次序,先不给出答案,请你先思考,如何解答,然后再继续阅读。
算法分析⼀个简单粗暴的算法就是⽣成给定作业集合的所有⼦集,并检查每⼀个⼦集以确定该⼦集中作业的可⾏性,然后找出哪个可⾏⼦集可以产⽣最⼤收益。
这是⼀个典型的贪⼼算法。
算法思路如下:1)根据收益递减顺序对所有作业进⾏排序。
2)将结果序列初始化,并把已排序作业中的第⼀个作业加⼊3)依次按下⾯的规则处理剩余的n-1个作业如果把当前作业加⼊结果序列,不会错过它的截⽌时间,那么把它加⼊结果序列;否则忽略当前的作业。
算法第4章-第5讲-贪心法(2)
从上面不难发现:先去掉小数据得到的是最大值 先去掉大数据得到的是最小值
第5讲 贪心算法
问题分析:下面用3个数为例来说明贪心策略的合理性, 不防设:a<b< c,表示为: b=a+k1,c=a+k1+k2 则计算结果为: (a×b+1)×c+1 =a3+(2k1+k2) a2+(k12+k1k2)a+k1+k2+1
0-1背包问题
• 0-1背包问题数学模型:
n Ma x v i x i i 1 n wi x i C i 1 x i {0,1 } C表示背包的容量;Wi表示物品i的重量;Vi表示物品i 的价值;Xi表示物品i是否背包,0表示物品不装入背 包,1表示物品不装入背包。
计算机科学学院 王小明
(博士/教授/博士生导师) Email: wangxm@
回顾:哪些问题适合用“贪心法”获得的最优解? 满足:贪心选择性质、最优子结构性质 的问题适合用“贪心法” 求 最优解
那么,何谓贪心选择性质、最优子结构性质 ?
1.贪心选择性质 所求问题的整体最优解可以通过一系列局部最优解的选择,即 “贪心选择”来得到。 2.最优子结构性质 当一个问题的最优解包含其所有子问题的最优解时,称此问题具 有最优子结构性质。
(a×b+1)×c+1 =a3+(2k1+k2)a2+(k12+k1k2)a+k1+1
(a×b+1)×c+1 =a3+(2k1+k2)a2+(k12+k1k2)a+1
当n大于3时,我们可经过n-3次变换后得到3个数。显然此问题 适合贪婪策略。求最大数的时候操作较小数;求最小数的时候 操作较大数。
算法作业——第4章贪心算法
算法作业——第4章贪⼼算法第4章 贪⼼算法 习题贪⼼算法 习题第4章【+】阅读、掌握课本经典范例代码的实现:(1)活动安排问题;(2)最优装载问题;(3)哈夫曼编码;(4)单源最短路径;(5)最⼩⽣成树;(6)多机调度问题。
【第1题】单项选择题(1)下⾯是贪⼼算法的基本要素的是( )。
A.重叠⼦问题B.构造最优解C.贪⼼选择性质D.定义最优解(2)下⾯问题( )不能使⽤贪⼼法解决。
A.单源最短路径问题B. n皇后问题C.最⼩花费⽣成树问题D.背包问题(3)采⽤贪⼼算法的最优装载问题的主要计算量在于将集装箱依其重量从⼩到⼤排序,故算法的时间复杂度为( )。
A.O(n)B.O(n2)C.O(n3)D.O(nlog2n)(4)关于0-1背包问题以下描述正确的是( )。
A.可以使⽤贪⼼算法找到最优解B.能找到多项式时间的有效算法C.使⽤教材介绍的动态规划⽅法可求解任意0-1背包问题D.对于同⼀背包与相同的物品,做背包问题取得的总价值⼀定⼤于等于做0-1背包问题(5)⼀棵哈夫曼树共有215个结点,对其进⾏哈夫曼编码,共能得到( )个不同的码字。
A.107B.108C.214D.215【第2题】求解哈夫曼编码中如何体现贪⼼思路?【第3题】举反例证明0-1背包问题若使⽤的算法是按照vi/wi的⾮递减次序考虑选择的物品,即只要正在被考虑的物品装得进就装⼊背包,则此⽅法不⼀定能得到最优解(此题说明0-1背包问题与背包问题的不同)。
*【第4题】给定数轴X上n个不同点的集合,{x1,x2,...,xn},其中,x1<x2<...<xn。
现在⽤若⼲个长度为1的闭区间来覆盖这些点。
设计⼀个算法找到最少的闭区间个数和位置。
证明算法的正确性并估计算法的时间复杂度。
【第5题】(编程)求解硬币问题。
有1分、2分、5分、10分、50分和100分的硬币各若⼲枚,现在要⽤这些硬币来⽀付W元,最少需要多少枚硬币。
说明:⽤结构体数组A存放硬币数据,A[i].v存放硬币i的⾯额,A[i].c存放硬币i的枚数。
第四章-贪心算法(模拟试题)
第四章-贪⼼算法(模拟试题)计算机与信息科学学院2010-2011学年第2学期模拟试卷计算机算法设计与分析—第四章.贪⼼算法本卷满分100分完卷时间120分钟⼀. 简答题(每⼩题2分,共20分)1. 当⼀个问题具有且具有时可⽤贪⼼算法,如最⼩⽣成树问题(背包问题,活动安排问题等)。
2. 在动态规划可⾏的基础上满⾜才能⽤贪⼼。
3. 贪⼼算法总是作出在当前看来最好的选择。
也就是说贪⼼算法并不从整体最优考虑,它所作出的选择只是在某种意义上的选择。
4. 动态规划算法通常以的⽅式解各⼦问题,⽽贪⼼算法则通常以的⽅式进⾏,以迭代的⽅式作出相继的贪⼼选择,每作⼀次贪⼼选择就将所求问题简化为规模更⼩的⼦问题5. 贪⼼算法和动态规划算法都要求问题具有性质,这是2类算法的⼀个共同点。
6. 当⼀个问题的最优解包含其⼦问题的最优解时,称此问题具有。
7. 对于具有n 个顶点和e 条边的带权有向图,如果⽤带权邻接矩阵表⽰这个图,那么Dijkstra 算法的主循环体需要时间。
这个循环需要执⾏n-1次,所以完成循环需要时间。
算法的其余部分所需要时间不超过。
8. 0-1背包问题指:给定n 种物品和⼀个背包。
物品i 的重量是Wi ,其价值为Vi ,背包的容量为C 。
应如何选择装⼊背包的物品,使得装⼊背包中物品的最⼤。
9. 有⼀批集装箱要装上⼀艘载重量为c 的轮船。
其中集装箱i 的重量为Wi 。
最优装载问题要求确定在不受限制的情况下,将装上轮船。
10. 多机调度问题要求给出⼀种作业调度⽅案,使所给的n 个作业在由m 台机器加⼯处理完成。
⼆. 综合题(1-6题每题7分,7-8题每题9分,共60分)1. 有4个物品,其重量分别为(4, 7, 5, 3),物品的价值分别为(40, 42, 25,12),背包容量为10。
试设计3种贪⼼策略,并给出在每种贪⼼策略下背包问题的解。
)(n O2. 使⽤prim算法构造出如下图G的⼀棵最⼩⽣成树。
dist(1,2)=6;dist(2,5)=3;dist(5,6)=6;dist(6,4)=2;dist(4,1)=5;dist(1,3)=1;dist(2,3)=5;dist(3,4)=5;dist(3,6)=4;dist(5,3)=63. 设有n项独⽴的作业{1,2,…, n},由m台相同的机器加⼯处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法实现题4-5 程序存储问题
数据输入:
第一行是2 个正整数,分别表示文件个数n和磁带的长 度L。接下来的1 行中,有n个正整数,表示程序存放在磁 带上的长度。
结果输出: 最多可以存储的程序数。
输入示例
6 50
2 3 13 8 80 20 输出示例
5
i 012345
x 2 3 13 8 80 20 7
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
532.00
10
算法实现题4-6 最优服务次序问题
double greedy( vector<int> x) {
int i,n=x.size(); sort(x.begin(),x.end()); for(i=1;i<n;++i)
x[i] += x[i-1]; double t=0; for(i=0;i<n;++i) t+=x[i]; t /= n;
算法实现题4-5 程序存储问题
int greedy( vector<int> x, int m){
int i=0, sum=0, n=x.size();
sort(x.begin(),x.end());
while(i
if(sum <= m) i++;
else return i;
对于给定的n个顾客需要的服务时间和s的值,编程 计算最优服务次序。
12
算法实现题4-7 多处最优服务次序问题
数据输入: 第一行有2 个正整数n 和s,表示有n 个顾客且有s
处可以提供顾客需要的服务。接下来的1 行中,有n 个正整数,表示n个顾客需要的服务时间。 结果输出:
最小平均等待时间。 输入示例 10 2 56 12 1 99 1000 234 33 55 99 812 输出示例 336
int i=0,j=0; while(i < n){
su
求和数组
st[j] += x[i];
01
su[j] += st[j]; ++i,++j;
1 12
if(j == s) j=0; i 0 1 2 3 4 5 6 7 8 9
}
x 1 12 33 55 56 99 99 234 812 1000
double t=0; for(i=0;i<s;++i) t += su[i];
14. 嵌套箱问题 15. 套汇问题 16. 信号增强装置问题 17. 磁带最大利用率问题 18. 非单位时间任务安排问题 19. 多元Huffman编码问题 20. 多元Huffman编码变形 21. 区间相交问题 22. 任务时间表问题 23. 最优分解问题 24. 可重复最优分解问题 25. 可重复最优组合分解问题 26. 旅行规划问题 27. 登山机器人问题
定义:
vector<int> x; 读取数据:
int n; scanf(“%d”, &n); int temp; for (int i=0; i<n; i++){
scanf(“%d”, &temp); x.push_back(temp); }
return t;
}
i 01234567 8 9
x 1 12 33 55 56 99 99 234 812 1000
第4章 贪心算法
1
课程安排
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 周二 P P T T P T T P T T P T T T T P
周四 P
P
P
P
P
P
P
P
P
P
P
P
P
P
端午
考试 T
2
第4章 贪心算法
1. 会场安排问题 2. 最优合并问题 3. 磁带最优存储问题 4. 磁盘文件最优存储问题 5. 程序存储问题 6. 最优服务次序问题 7. 多处最优服务次序问题 8. d森林问题 9. 汽车加油问题 10. 区间覆盖问题 11. 硬币找钱问题 12. 删数问题 13. 数列极差问题
}
return n; }
//所有的程序都没有磁带长
i 012345
x 2 3 8 13 20 80
贪心策略:最短程序优先
排序后的数据
8
算法实现题4-6 最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序 才能使平均等待时间达到最小?平均等待时间是n 个 顾客等待服务时间的总和除以n。 编程任务:
加 1 13 46 101 157 256 355 589 1401 240111
算法实现题4-7 多处最优服务次序问题
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务
时间为ti ,1<= i <= n。共有s 处可以提供此项服务。 应如何安排n 个顾客的服务次序才能使平均等待时间 达到最小?平均等待时间是n个顾客等待服务时间的总 和除以n。 编程任务:
对于给定的n个顾客需要的服务时间,编程计算最 优服务次序。
9
算法实现题4-6 最优服务次序问题
数据输入: 第一行是正整数n,表示有n 个顾客。接下来的1行
中,有n个正整数,表示n个顾客需要的服务时间。 结果输出:
计算出的最小平均等待时间。 输入示例 10
56 12 1 99 1000 234 33 55 99 812 输出示例
排序后的数据
t /= n;
return t; }
14
算法实现题4-9 汽车加油问题
问题描述 一辆汽车加满油后可行驶nkm 。旅途中有若干个加
油站。设计一个有效算法,指出应在哪些加油站停靠 加油,使沿途加油次数最少。 编程任务
对于给定的n和k个加油站位置,编程计算最少加油 次数。
13
算法实现题4-7 多处最优服务次序问题
double greed(vector<int> x,int s) {
vector<int> st(s+1,0); vector<int> su(s+1,0); int n = x.size();
st
服务数组
01
1 12
sort(x.begin(),x.end());