第四章-贪心算法(模拟试题)
第4章贪心算法习题(免费阅读)
算法实现题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++;
贪心算法练习题
贪心算法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时间开始。
解题思路:这是一个贪心法中选择不相交区间的问题。
先对活动结束时间从小到大排序,排序的同时活动的起始时间也要跟着变化。
而且,结束时间最小的活动一定会安排,不然这段时间就白白浪费了。
后一个活动的起始时间如果比前一个活动的结束时间大,即两个活动没有相交时间,就把这个活动也安排上。
(完整版)4+四+贪心算法+习题参考答案
第四章作业部分参考答案1 • 设有n个顾客同时等待一项服务。
顾客i需要的服务时间为t i,1 i n。
应该如何安排n个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。
试给出你的做法的理由(证明) 。
策略:对t i 1 i n进行排序,h t i2t i n,然后按照递增顺序依次服务i i」2,…,i n即可。
解析:设得到服务的顾客的顺序为j1, j2,..., j n ,则总等待时间为T (n 1)t j i (n 2)t j2 2.? 则在总等待时间T中切的权重最大,切的权重最小。
故让所需时间少的顾客先得到服务可以减少总等待时间。
证明:设t i1 t i2 t i n, ,下证明当按照不减顺序依次服务时,为最优策略。
记按照i1i2 i n 次序服务时,等待时间为T ,下证明任意互换两者的次序,T 都不减。
即假设互换i, j (i j) 两位顾客的次序,互换后等待总时间为T~,则有T T.由于T (n 1)t i1 (n 2)t i2 2t i n2 t,i n 1T (n 1)t i1 (n 2)t i2 (n i)t i i (n j)t i j 2t ti n 2 i n 1T (n 1)t i1 (n 2)t i2 (n i)t i j (n j)t i i 2t i t ii n 2 i n 1则有T~ T (j i)(t i j t i i ) 0.同理可证其它次序,都可以由i1i2 i n 经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而i1i 2 i n 为最优策略2. 字符a ~h 出现的频率分布恰好是前 8个Fibo nacci 数,它们的Huffman编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情 形。
Fib on acci 数的定义为:F o1,F i 1, F nF n 2 F n 1 if n 1所以a 的编码为:1111111 b 的编码为:1111110 c 的编码为:111110 d 的编码为:11110 e 的编码为:1110 f 的编码为:110 g 的编码为:10 h 的编码为:0 推广到 n 个字符:第 1 个字符: n-1 个 1 ,11 1n1 第 2 个字符: n-2 个1 , 1 个 0, 11 10n2第 3 个字符: n-3 个 1 ,1 个 0, 11 10n3第n-1个字符:1个1 , 1 个 0, 10 第 n 个字符: 1 个 03. 设 p 1,p 2, ,p n 是准备存放到长为 L 的磁带上的 n 个程序,程序 p i 需要的 n 带长为 a i 。
c语言贪心算法题目
c语言贪心算法题目
问题描述:
给定一个非负整数数组nums,你的任务是通过在数组中选择一些数,使得这些数的和最大,并且所选的数不能相邻。
请编写一个C程序,实现该任务。
函数原型:
int maxSum(int* nums, int numsSize);
输入参数:
- nums: 非负整数数组nums
- numsSize:数组nums的大小
输出:
返回所选数的最大和
示例:
输入:[1,2,3,1]
输出:4
解释:选择索引为0和2的元素,即nums[0]=1和nums[2]=3,它们的和为4,满足选取数的和最大且不相邻的要求。
提示:
1. 贪心算法是一种优化问题的解决方法,它每次都选择当前最优的解,希望通过局部最优解的选择来达到全局最优解。
2. 对于本题,可以使用动态规划的思想来解决。
通过定义一个dp数组,dp[i]表示选择索引为0到i之间的元素,所选数的最大和。
则对于元素nums[i],有两种选择:选或不选。
- 如果选择nums[i],则dp[i] = nums[i] + dp[i-2]
- 如果不选择nums[i],则dp[i] = dp[i-1]
- 因此,对于每个i,我们选择使得dp[i]最大的方案,直到求得dp[numsSize-1],即所选数的最大和。
3. 初始化dp数组时,dp[0]=nums[0],dp[1]=max(nums[0], nums[1]),从第三个元素开始遍历数组即可。
贪心算法小题集
混合牛奶Description牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。
请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶。
快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。
而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。
每天,快乐的牛奶制造者从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。
给出快乐牛奶制造者的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算快乐的牛奶制造者所要付出钱的最小值。
Input第1 行:二个整数, N 和M。
第一个数值,N,(0<= N<=2,000,000)是快乐的牛奶制造者的一天需要牛奶的数量。
第二个数值,M,(0<= M<=5,000)是他们可能从农民那买到的数目。
第2 到M+1 行:每行二个整数,Pi 和Ai。
Pi(0<= Pi<=1,000) 是农民i 牛奶的价格。
Ai(0 <= Ai <= 2,000,000)是农民i 一天能卖给快乐的牛奶制造者的牛奶数量。
Output单独的一行包含单独的一个整数,表示快乐的牛奶制造者拿到所需的牛奶所要的最小费用Sample Input100 55 209 403 108 806 30Sample Output630Hint每天农民生产的牛奶的总数对快乐的牛奶制造者来说足够的。
Sourceusaco 1.3.1混合牛奶Description牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。
请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶。
快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。
第四章-贪心算法(模拟试题)
第四章-贪⼼算法(模拟试题)计算机与信息科学学院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. 旅行商问题(Travelling Salesman Problem):问题描述:给定一个城市列表和一个距离列表,要求找出一条路径,使得路径上的所有城市都经过,且总距离最短。
贪心算法解法:首先对城市按照距离进行排序,然后从最近的两个城市开始,每次都选择距离当前位置最近的两个城市,直到遍历完所有城市。
由于贪心算法每次选择的都是当前情况下的最优解,因此最终得到的路径总距离是最短的。
2. 背包问题(Knapsack Problem):问题描述:给定一组物品,每个物品都有自己的重量和价值,要求在不超过背包总重量的情况下,如何选择物品使得背包中物品的总价值最大。
贪心算法解法:按照物品的重量对物品进行排序,然后每次选择重量最小的物品,直到背包已满或无物品可选。
由于贪心算法每次选择的都是当前情况下的最优解,因此最终得到的方案总是可以找到一个大于等于当前最优解的方案。
3. 网格找零问题(Currency Change Problem):问题描述:给定一组面值不同的硬币,要求用最少的组合方式从一定金额中找零。
贪心算法解法:首先对硬币面值进行排序,然后每次使用当前面值最小的硬币进行组合,直到金额为零或无硬币可选。
贪心算法在此问题中的思路是每次选择最小的硬币进行使用,这样可以保证找零的最小数量。
以上题目和解答只是贪心算法的一部分应用,实际上贪心算法在许多其他领域也有广泛的应用,例如网页布局优化、任务调度、网络流等等。
贪心算法的优势在于其简单易懂、易于实现,但也有其局限性,例如无法处理一些存在冲突的情况或最优解不唯一的问题。
因此在实际应用中需要根据具体问题选择合适的算法。
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` 用于排序。
c++贪心算法经典例题
c++贪心算法经典例题(原创实用版)目录一、贪心算法的基本概念与特点二、贪心算法的经典例题1.背包问题2.带有期限的作业排序3.最小生成树4.单源点最短路径三、贪心算法的应用场景与策略选择四、贪心算法的优缺点及注意事项五、总结正文一、贪心算法的基本概念与特点贪心算法是一种求解最优化问题的方法,其主要特点是在每一步都做出当前看来最好的选择,从而希望导致结果是全局最好的解。
贪心算法不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。
二、贪心算法的经典例题1.背包问题:给定一组物品,每种物品都有一定的价值和重量,要求在限定的总重量内,选取若干物品放入背包,使得背包中物品的总价值最大。
2.带有期限的作业排序:给定一组作业,每项作业有固定的执行时间和期限,要求在期限内尽可能多地完成作业,使得完成作业的总时间最小。
3.最小生成树:给定一个无向连通图,要求找出一棵包含所有顶点且边权值之和最小的生成树。
4.单源点最短路径:给定一个有权值边的无向图,要求找出从指定源点到其他所有顶点的最短路径。
三、贪心算法的应用场景与策略选择贪心算法适用于问题能够分解成子问题来解决的情况,子问题的解可以相互独立地求得。
在贪心算法的应用过程中,需要仔细分析问题的特点,选择合适的贪心策略。
贪心策略的选择必须满足无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
四、贪心算法的优缺点及注意事项贪心算法的优点是简单易懂、代码实现简单,且在许多情况下能够得到整体最优解。
缺点是贪心算法并不适用于所有问题,对于一些具有特殊性质的问题,可能无法得到最优解。
在使用贪心算法时,需要注意贪心策略的选择,避免因为贪心策略不合适而导致解的不正确。
五、总结贪心算法是一种求解最优化问题的方法,其关键在于选择合适的贪心策略。
贪心算法适用于问题能够分解成子问题来解决的情况,能够快速得到满意的解。
贪心算法经典例题
贪心算法经典例题所谓贪心算法指的是为了解决在不回溯的前提之下,找出整体最优或者接近最优解的这样一种类型的问题而设计出来的算法。
贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。
因此能够使用贪心算法的问题必须满足下面的两个性质:1.整体的最优解可以通过局部的最优解来求出;2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。
使用贪心算法当中的两个典型问题是活动安排问题和背包问题。
利用贪心算法解题,需要解决两个问题:一是问题是否适合用贪心法求解。
我们看一个找币的例子,如果一个货币系统有3种币值,面值分别为一角、五分和一分,求最小找币数时,可以用贪心法求解;如果将这三种币值改为一角一分、五分和一分,就不能使用贪心法求解。
用贪心法解题很方便,但它的适用范围很小,判断一个问题是否适合用贪心法求解,目前还没有一个通用的方法,在信息学竞赛中,需要凭个人的经验来判断何时该使用贪心算法。
二是确定了可以用贪心算法之后,如何选择一个贪心标准,才能保证得到问题的最优解。
在选择贪心标准时,我们要对所选的贪心标准进行验证才能使用,不要被表面上看似正确的贪心标准所迷惑,如下面的例子。
例2 (NOIP1998tg)设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213又如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613 输入:NN个数输出:连接成的多位数算法分析:此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。
按这种贪心标准,我们很容易找到反例:12,121 应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如:12,123 就是12312而非12112,这样情况就有很多种了。
c++贪心算法经典例题
c++贪心算法经典例题摘要:一、贪心算法简介1.贪心算法的定义2.贪心算法的特点3.贪心算法适用的问题类型二、C++贪心算法经典例题1.背包问题a.0-1 背包问题b.完全背包问题c.动态背包问题2.最小生成树a.Kruskal 算法b.Prim 算法3.单源点最短路径a.Dijkstra 算法b.Floyd-Warshall 算法4.最长公共子序列a.贪心算法实现b.动态规划实现正文:一、贪心算法简介贪心算法(Greedy Algorithm)是一种求解最优解的方法。
它是在对问题求解时,总是做出在当前看来是最好的选择。
贪心算法并不追求整体最优解,只希望得到较为满意的解。
贪心算法的关键是贪心策略的选择,必须满足无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
贪心算法适用的问题类型包括背包问题、最小生成树、单源点最短路径和最长公共子序列等。
二、C++贪心算法经典例题1.背包问题背包问题(Knapsack Problem)是一种典型的贪心算法问题。
它描述的是有一个背包,有一定的容量,需要装载若干物品,每个物品有一定的价值和重量,要求在不超过背包容量的前提下,如何选择装载物品使得背包中的物品总价值最大。
背包问题可以分为0-1 背包问题、完全背包问题和动态背包问题。
2.最小生成树最小生成树(Minimum Spanning Tree,简称MST)是一种图论中的算法问题。
给定一个加权连通图,求解一个生成树,使得该生成树中所有边的权值之和最小。
最小生成树的经典算法有Kruskal 算法和Prim 算法。
3.单源点最短路径单源点最短路径(Single Source Shortest Path)问题是在一个图中,从源点出发到其他所有顶点的最短路径。
经典算法包括Dijkstra 算法和Floyd-Warshall 算法。
4.最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)问题是求两个序列中最长的公共子序列。
贪心法例题
贪心法(一)1、纪念品分组(group.pas)【问题描述】元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。
为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。
为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
【输入】输入文件group . in包含n+2行:第1行包括一个整数w,为每组纪念品价格之和的上限。
第2行为一个整数n,表示购来的纪念品的总件数。
第3~n+2行每行包含一个正整数pi(5<=p:<=w),表示所对应纪念品的价格。
【输出】输出文件group.out仅一行,包含一个整数,即最少的分组数目。
【输入输出样例】【限制】50%的数据满足:1<=n<=15100%的数据满足:1<=n<=30000,80<=w<=2002、独木舟(kaj.bas)【问题描述】我们计划组织一个独木舟旅行。
租用的独木舟都是一样的,最多乘两人,而且载重有一个限度。
现在要节约费用,所以要尽可能地租用最少的舟。
你的任务是读入独木舟的载重量,参加旅行的人数以及每个人的体重,计算出所需要的租船数目。
【输入格式】输入文件名为kaj.in,其第一行是w(8O≤w≤200),表示每条独木舟最大的载重量。
第二行是整数n(1≤n≤30000,参加旅行的人数。
接下来的n行,每行是一个整数Ti(5 ≤Ti≤w),表示每个人的重量。
【输出格式】输出文件仅一行,表示最少的租船数目。
【样例输入】1009902020305060708090【样例输出】63.修复牛棚(barn.bas)【问题描述】农夫约翰在一个呈一字排开的牛棚里养了一群牛。
这个牛棚有很多隔间,每个隔间的大小都是一样的。
一个隔间里只能放一头牛。
贪心算法练习题
贪心算法练习题贪心算法是一种常用的解决问题的思想和方法,它通常用于求解优化问题。
贪心算法的核心思想是:在每一步选择中都采取当前状态下最优的选择,从而希望最终能够达到全局最优。
在实际应用中,贪心算法常用于解决一些分类问题,如最小生成树、最短路径、背包问题等。
下面,将给出一些贪心算法的练习题,帮助读者更好地理解和掌握贪心算法的应用。
1. 零钱兑换问题假设我们有不同面额的硬币,如 1 美元、2 美元、5 美元等,我们希望找零 n 美元的时候,最少需要多少个硬币。
请用贪心算法解决此问题,并给出相应的代码实现。
2. 区间覆盖问题给定一个区间集合,选择尽可能少的区间,使得这些区间的并集能够覆盖全部的区间。
请使用贪心算法解决此问题,并给出相应的代码实现。
3. 活动选择问题给定 n 个活动的开始时间和结束时间,选择尽可能多的不相交的活动。
请使用贪心算法解决此问题,并给出相应的代码实现。
4. 任务调度问题假设我们有 n 个任务和 m 台执行任务的机器,每个任务需要一个单位的时间,在每台机器上只能执行一个任务。
如何安排任务,使得所有任务都能够被执行,并且时间最短。
请使用贪心算法解决此问题,并给出相应的代码实现。
以上是一些常见的贪心算法练习题,通过解决这些问题,读者可以更加深入地理解和掌握贪心算法的应用。
当然,在实际应用中,贪心算法并不是万能的,它只能求解一些特定类型的优化问题,对于其他类型问题的求解可能并不适用。
因此,在使用贪心算法时,需要仔细分析问题的特性,判断是否适用贪心算法,并注意贪心选择的合理性。
通过不断练习和实践,读者可以逐渐掌握贪心算法的应用技巧,提高问题求解的效率和准确性。
最后,希望读者能够善于思考,灵活运用贪心算法解决实际问题,并在实践中不断学习和进步。
贪心算法作为一种常用的解决问题的思想和方法,对于提高算法设计和分析能力具有重要意义。
贪心算法练习题
贪心算法练习题贪心算法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.会场安排问题描述学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。
算法作业——第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的枚数。
贪心算法例题
贪心算法例题
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
以下是一个贪心算法的例子:
问题描述:有100个人在一酒吧,一次酒局中大家都决定向其他每个人敬酒,但只有距离较近的人之间才能互敬。
酒局结束后,每人都记录下他们之间互敬了多少次。
现给出所有人的互敬次数,找出互敬次数最多的那个人。
贪心策略:从最多互敬次数的人开始,每次都选择能互敬次数最多的人,直到达到最大互敬次数为止。
具体实现:
1. 首先将所有人的互敬次数存入一个数组中。
2. 从数组中找到互敬次数最多的人,假设其互敬次数为max_times。
3. 从数组中删除所有互敬次数小于max_times的人,因为他们的互敬次数已经确定不会超过max_times。
4. 重复步骤2和3,直到数组为空。
这个贪心算法的例子中,每次选择都是基于当前情况下的最优选择,希望通过这种方式达到全局最优的结果。
贪心法例题
贪心法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,所以也说明了任何次序的改变,都会导致等待时间的增加。
贪心算法例题
贪心算法例题1木板制造问题描述现在需要制造N块木板,每块木板都有一个长度L和宽度W。
用来制造木板的机器在使用之前需要花1分钟时间进行调节,而且,如果在制造完一块木板L0×W0之后继续制造木板L1×W1,那么除非满足L0≤L1且W0≤W1,否则在制造L1×W1之前仍要花费1分钟进行调节。
现在给出欲制造的N块木板的尺寸,你的任务是确定至少需要花多长时间调节机器。
时间复杂度要求实现O(N2)时间复杂度的算法。
本题算法的最优时间复杂度为Θ(NlogN)。
2 雷达安装问题描述在笛卡尔坐标系上,我们认为海岸线是x轴,陆地在x轴下方,海洋在x轴上方,而每个岛屿都认为是海中的一个点。
现在要在海岸线上安装一些雷达,雷达的覆盖半径为d。
如果某个岛屿与离它最近的雷达之间的距离不超过d,这个岛屿就被监视了。
现在有N个岛屿需要监视,给出这N个岛屿的坐标,你的任务是确定为了监视所有的岛屿至少需要安装多少个雷达。
时间复杂度要求实现Θ(NlogN)时间复杂度的算法,而这也是本题时间复杂度的下限。
3 修理牛棚问题描述农夫约翰的牛棚是N个房间一个紧挨着一个排成一行的结构,每个房间的宽度都是1。
在一个暴风雨的夜晚,牛棚所有的天花板都被吹走了。
好在许多牛正在度假,所以牛棚没有住满,有些房间里面有牛,有些没有。
一共有S (1≤S≤N)个房间是有牛居住的。
农夫约翰打算至少先把有牛居住的房间的屋顶修好。
他的木材提供商只愿意提供M块木板,但是每块木板都可以是任意长度的。
农夫约翰想知道他至少需要购买多长的木板才能把牛都盖住。
时间复杂度要求实现O(NlogN)复杂度的算法。
本题算法的最优时间复杂度为Θ(N)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机与信息科学学院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台相同的机器加工处理。
作业i所需要的处理时间为ti。
约定:任何一项作业可在任何一台机器上处理,但未完工前不准中断处理;任何作业不能拆分更小的子作业。
多机调度问题要求给出一种调度方案,使所给的n个作业在尽可能短的时间内由m台机器处理完。
设计算法,并讨论是否可获最优解。
4. 设有n种面值为:d1≥d2≥……≥dn的钱币,需要找零钱M,如何选择钱币dk ,的数目Xk,满足 d1×Xi+……dn×XnM ,使得Xi+ (X)n最小。
请选择贪心策略,并设计贪心算法。
5. 在下列空格中填入适当的语句完成贪心方法的抽象化控制procedure GREEDY(A,n)//A(1:n)包含n个输入//solutions←①;for i←1 to ② dox←SELECT(A)if FEASIBLE(solution,x)then solutions←③;endif④;return(solution)end GREEDY6. 填空完成背包问题的贪心算法procedure GREEDY-KNAPSACK(P,W,M,X,n)X←0 //将解向量初始化为零//cu←M //cu是背包剩余容量//for i←1 to n doif ① then exit endifX(i) ←②;cu←③;④;if i≤n then X(i) ←⑤;endifend GREEDY-KNAPSACK7. 填空完成带有限期的作业排序line procedure JS(D,J,n,k)//D(1),…,D(n)是期限值。
n≥1。
作业已按p1≥p2≥…pa被排序。
J(i)是最优解中的第i个作业,1≤i≤k。
终止时,D(J(i)≤D(J(I+1)),1≤i<k//1 integer D(0:n),J(0:n),i,k,n,r2 D(0)←J(0) ←0 //初始化//3 k←1;J(1) ←1 //计入作业1//4 for ① to n do5 ② ;6 while ③ and ④ do7 ⑤ ;8 repeat9 if D(J(r))≤D(i) and D(i)>r then10 for ⑥⑦ by-l do11 ⑧;12 repeat13 ⑨;k←k+1;14 endif15 repeat16 end JS8. 有n 个活动争用一个活动室。
已知活动i占用的时间区域为[si ,fi],活动i,j相容的条件是:sj≥fi ,问题的解表示为(xi| xi=1,2…,n,),xi表示顺序为i的活动编号活动,求一个相容的活动子集,且安排的活动数目最多。
三.简答题(每题5分,共20分)1.简述贪心法的设计思想。
2.简述Kruskal算法构造G的最小生成树的基本思想3.试举例说明贪心算法对有的问题是有效的,而对一些问题是无效的。
4.简述贪心算法与动态规划算法的差异参考答案:一、 填空题:1.最优子结构性质 贪心选择性质2.贪心选择性3.局部最优4.自底向上 自顶向下5.最优子结构6.最优子结构性质7.O (n2) O (n2)8.总价值9.尽可能多的集装箱 10.尽可能短的时间内二、综合题:1. 解:重量最轻:装入1,4,3.总价值:40+12+25*3/5=67 价值最大:装入1,2。
总价值:40*3/4+42=72 性价比最小:装入1,2.总价值:40+6/7*42=76 2.解:3.解:对于处理机j ,用S[j] 表示处理机j 已有的作业数,用P[j,k]表示处理机j 的第k 个作业的序号 。
1)将作业按照t[1]≥t[2]≥……≥t[n]排序2)S[1:m]清零 j ←0 //从第一个处理机开始安排 3) for i ←1 to n do //安排n 个作业 j ←j mod m +1 //选下一个处理机 S[j]←S[j]+1; P[j,S[j]]←i ;Repeat4.解:贪心原则:每次选择最大面值硬币。
CU←M;i←1;X←0 // X为解向量While CU≠0 doX[i]←CU div d[i] // X[i]为第i中硬币数CU←CU-d[i]*X[i←i+1;repeat5.①Φ② n ③ UNION(solution,x) ④ repeat6. ① W(i) ≤ cu ② 1 ③cu-W(i) ④repeat ⑤cu/ W(i)7. ① i=2 ②r ← k ③D(J(r))>D(i) ④D(J(r))<>r⑤r←r-1 ⑥ l←k ⑦ r+1 ⑧ J(I+1) ←J(l) ⑨ J(r+1)←i8. 解:解决这个问题的基本思路是在安排时应该将结束时间早的活动尽量往前安排,好给后面的活动安排留出更多的空间,从而达到安排最多活动的目标。
据此,贪心准则应当是:在未安排的活动中挑选结束时间最早的活动安排。
在贪心算法中,将各项活动的开始时间和结束时间分别用两个数组s和f存储,并使得数组中元素的顺序按结束时间非减排列:f1? f2?…? fn。
算法如下:GreedyAction(s, f,n) // s[1:n]、f[1:n]分别代表n项活动的起始//时间和结束时间, 并且满足f[1]? f[2]?…? f[n]j=1; solution={1}; //解向量初始化为空集for i ←2 to n doif si?fj thensolution=solution ? {j}; // 将j加入解中j=i;endifendforreturn(solution);end Greedy三.简答题1.把一个问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解。
(指根据当前已有信息做出选择,不从整体最优考虑,只选择局部最优)2.首先将G的n个顶点看成n个孤立的连通分支。
将所有的边按权从小到大排序。
然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。
这个过程一直进行到只剩下一个连通分支时为止。
3.贪心算有效性:最小生成树、哈弗曼、活动安排、单元最短路径。
无效反例:0——1背包问题,无向图找最短路径问题。
4.贪心算法和动态规划算法都要求问题具有最优子结构性质,这是2类算法的一个共同点。
但是,对于具有最优子结构的问题应该选用贪心算法还是动态规划算法求解?是否能用动态规划算法求解的问题也能用贪心算法求解?下面研究2个经典的组合优化问题,并以此说明贪心算法与动态规划算法的主要差别。