第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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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());