第四章-贪心算法(模拟试题)

合集下载

第4章贪心算法习题(免费阅读)

第4章贪心算法习题(免费阅读)
6
算法实现题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+四+贪心算法+习题参考答案

(完整版)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语言贪心算法题目

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++贪心算法经典例题

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` 用于排序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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个经典的组合优化问题,并以此说明贪心算法与动态规划算法的主要差别。

相关文档
最新文档