简单的贪心算法
贪心算法-01背包问题
![贪心算法-01背包问题](https://img.taocdn.com/s3/m/18ae521ff08583d049649b6648d7c1c708a10bf6.png)
贪⼼算法-01背包问题1、问题描述:给定n种物品和⼀背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
问:应如何选择装⼊背包的物品,使得装⼊背包中物品的总价值最⼤?形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找⼀n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最⼤.即⼀个特殊的整数规划问题。
2、最优性原理:设(y1,y2,…,yn)是 (3.4.1)的⼀个最优解.则(y2,…,yn)是下⾯相应⼦问题的⼀个最优解:证明:使⽤反证法。
若不然,设(z2,z3,…,zn)是上述⼦问题的⼀个最优解,⽽(y2,y3,…,yn)不是它的最优解。
显然有∑vizi > ∑viyi (i=2,…,n)且 w1y1+ ∑wizi<= c因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n)说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的⼀个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,⽭盾。
3、递推关系:设所给0-1背包问题的⼦问题的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。
由0-1背包问题的最优⼦结构性质,可以建⽴计算m(i,j)的递归式:注:(3.4.3)式此时背包容量为j,可选择物品为i。
此时在对xi作出决策之后,问题处于两种状态之⼀:(1)背包剩余容量是j,没产⽣任何效益;(2)剩余容量j-wi,效益值增长了vi ;使⽤递归C++代码如下:#include<iostream>using namespace std;const int N=3;const int W=50;int weights[N+1]={0,10,20,30};int values[N+1]={0,60,100,120};int V[N+1][W+1]={0};int knapsack(int i,int j){int value;if(V[i][j]<0){if(j<weights[i]){value=knapsack(i-1,j);}else{value=max(knapsack(i-1,j),values[i]+knapsack(i-1,j-weights[i]));}V[i][j]=value;}return V[i][j];}int main(){int i,j;for(i=1;i<=N;i++)for(j=1;j<=W;j++)V[i][j]=-1;cout<<knapsack(3,50)<<endl;cout<<endl;}不使⽤递归的C++代码:简单⼀点的修改//3d10-1 动态规划背包问题#include <iostream>using namespace std;const int N = 4;void Knapsack(int v[],int w[],int c,int n,int m[][10]);void Traceback(int m[][10],int w[],int c,int n,int x[]);int main(){int c=8;int v[]={0,2,1,4,3},w[]={0,1,4,2,3};//下标从1开始int x[N+1];int m[10][10];cout<<"待装物品重量分别为:"<<endl;for(int i=1; i<=N; i++){cout<<w[i]<<" ";}cout<<endl;cout<<"待装物品价值分别为:"<<endl;for(int i=1; i<=N; i++){cout<<v[i]<<" ";}cout<<endl;Knapsack(v,w,c,N,m);cout<<"背包能装的最⼤价值为:"<<m[1][c]<<endl;Traceback(m,w,c,N,x);cout<<"背包装下的物品编号为:"<<endl;for(int i=1; i<=N; i++){if(x[i]==1){cout<<i<<" ";}}cout<<endl;return 0;}void Knapsack(int v[],int w[],int c,int n,int m[][10]){int jMax = min(w[n]-1,c);//背包剩余容量上限范围[0~w[n]-1] for(int j=0; j<=jMax;j++){m[n][j]=0;}for(int j=w[n]; j<=c; j++)//限制范围[w[n]~c]{m[n][j] = v[n];}for(int i=n-1; i>1; i--){jMax = min(w[i]-1,c);for(int j=0; j<=jMax; j++)//背包不同剩余容量j<=jMax<c{m[i][j] = m[i+1][j];//没产⽣任何效益}for(int j=w[i]; j<=c; j++) //背包不同剩余容量j-wi >c{m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);//效益值增长vi }}m[1][c] = m[2][c];if(c>=w[1]){m[1][c] = max(m[1][c],m[2][c-w[1]]+v[1]);}}//x[]数组存储对应物品0-1向量,0不装⼊背包,1表⽰装⼊背包void Traceback(int m[][10],int w[],int c,int n,int x[]){for(int i=1; i<n; i++){if(m[i][c] == m[i+1][c]){x[i]=0;}else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;}运⾏结果:算法执⾏过程对m[][]填表及Traceback回溯过程如图所⽰:从m(i,j)的递归式容易看出,算法Knapsack需要O(nc)计算时间; Traceback需O(n)计算时间;算法总体需要O(nc)计算时间。
贪心算法原理及应用
![贪心算法原理及应用](https://img.taocdn.com/s3/m/be977d91185f312b3169a45177232f60ddcce782.png)
贪心算法原理及应用随着人工智能技术的不断发展,算法的种类也越来越多,其中贪心算法作为一种最基础的算法,也在不断优化和升级。
本文将简要介绍贪心算法原理及其应用,探讨贪心算法的优劣和适用场景。
一、贪心算法原理贪心算法是一种常见的优化算法,它的基本思想是:在每一步选择中都采取当前状态下最优的选择,从而希望最终得到全局最优的解。
贪心算法在每一步选择中都依赖于以前的选择结果,但不依赖于将来的选择结果。
这种贪心选择性质是该算法能达到最终全局最优解的保证。
然而,即使每个局部最优的选择都是正确的,但最终的全局最优解并不一定会得到,因此贪心算法不一定能得到全局最优解,但是在实际问题中,贪心算法通常可以得到非常接近最优解的结果。
二、贪心算法应用1.最小生成树最小生成树是图论中的一个经典算法问题,它可以用贪心算法来解决。
在给定一个带权无向图时,我们需要找到一棵生成树,使得生成树所有边的权值之和最小。
Prim算法和Kruskal算法都是基于这一思想建立的。
2.背包问题背包问题是一种经典的动态规划问题,也可以用贪心算法来解决。
在背包问题中,我们需要找到一种最佳的方案,使得放入背包的物品的总价值最大。
3.活动安排在一组活动中,每个活动都有一个开始时间和结束时间。
如何安排这些活动,使得可以安排的最多?可以用贪心算法进行解决。
三、贪心算法的优劣1.优点优点是:简单,易于实现;对于一些问题可以快速得到答案。
2.缺点缺点是:贪心算法不能保证得到全局最优解,只能得到最终结果接近最优解的结果。
在一些问题中会出现无解的情况。
此外,贪心算法需要根据实际问题进行调整,否则可能会得到错误的答案。
3.适用场景对于一些特殊的问题,贪心算法通常可以得到非常好的效果。
例如上文提到的最小生成树、背包问题和活动安排等等。
在这些问题中,贪心算法可以得到接近最优解的结果。
但是,在一些问题中,贪心算法的结果会偏离真实结果。
四、结语贪心算法是一种简单而实用的算法,它在很多实际问题中都有广泛的应用。
列举用贪心算法求解的经典问题
![列举用贪心算法求解的经典问题](https://img.taocdn.com/s3/m/6082a55d58eef8c75fbfc77da26925c52dc59172.png)
列举用贪心算法求解的经典问题贪心算法是一种简单而高效的问题求解方法,通常用于求解最优化问题。
它通过每一步选择当前状态下的最优解,最终得到全局最优解。
贪心算法的核心思想是:每一步都做出一个局部最优的选择,并认为这个选择一定可以达到全局最优。
以下是一些经典问题,可以用贪心算法求解:1. 零钱兑换问题(Coin Change Problem):给定一些不同面额的硬币和一个目标金额,找到最少的硬币数量,使得硬币总额等于目标金额。
贪心算法可以按照硬币的面额从大到小进行选择,每次选择尽量大面额的硬币。
2. 区间调度问题(Interval Scheduling Problem):给定一些区间,找到最多的不相交区间。
贪心算法可以按照区间的结束时间进行排序,每次选择结束时间最早的区间,确保选择的区间不重叠。
3. 分糖果问题(Candy Problem):给定一个数组表示每个孩子的评分,要求给这些孩子分糖果,满足以下要求:每个孩子至少分到一个糖果,评分高的孩子要比相邻孩子分到的糖果多。
贪心算法可以从左到右进行两次遍历,分别处理评分递增和评分递减的情况。
4. 跳跃游戏问题(Jump Game Problem):给定一个非负整数数组,表示每个位置的最大跳跃长度,判断是否能从第一个位置跳到最后一个位置。
贪心算法可以记录当前能够到达的最远位置,并且更新为更远的位置。
5. 任务调度器问题(Task Scheduler Problem):给定一串任务,每个任务需要一定的冷却时间,要求以最短的时间完成所有任务。
贪心算法可以按照出现次数进行排序,优先执行出现次数最多的任务,并在冷却时间内执行其他任务。
6. 区间覆盖问题(Interval Covering Problem):给定一些区间,找到最少的区间数,使得它们的并集覆盖了所有输入区间。
贪心算法可以根据区间的起始位置进行排序,每次选择最早结束的区间,并将它添加到最终结果中。
以上仅是一些经典问题的例子,实际上还有很多问题可以用贪心算法来求解。
贪心算法程序设计
![贪心算法程序设计](https://img.taocdn.com/s3/m/9c014aab80c758f5f61fb7360b4c2e3f56272544.png)
贪心算法程序设计贪心算法程序设计1. 什么是贪心算法贪心算法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。
贪心算法的核心思想是局部最优解能导致全局最优解。
2. 贪心算法的基本步骤贪心算法的基本步骤如下:1. 定义问题的优化目标。
2. 将问题分解成子问题。
3. 选择当前最优的子问题解,将子问题的解合并成原问题的解。
4. 检查是否达到了问题的优化目标,如果没有达到,则回到第二步,继续寻找下一个最优子问题解。
5. 在所有子问题解合并成原问题解后,得到问题的最优解。
3. 贪心算法的应用场景贪心算法的应用非常广泛,几乎可以用于解决各种优化问题。
以下几个常见的应用场景:1. 零钱找零问题:给定一定面额的纸币和硬币,如何找零使得所需纸币和硬币的数量最小?2. 区间调度问题:给定一些活动的开始时间和结束时间,如何安排活动使得可以办理的活动数量最大?3. 背包问题:给定一些具有重量和价值的物品,如何选择物品使得背包的总价值最大?4. 最小树问题:给定一个带权无向图,如何找到一棵树,使得它的边权之和最小?5. 哈夫曼编码问题:给定一组字符和相应的频率,如何构造一个满足最低编码长度限制的二进制编码?4. 贪心算法的优缺点贪心算法的优点是简单、高效,可以快速得到一个近似最优解。
而且对于一些问题,贪心算法能够得到全局最优解。
贪心算法的缺点在于它不一定能够得到全局最优解,因为在每一步只考虑局部最优解,无法回溯到之前的选择。
5. 贪心算法的程序设计在使用贪心算法进行程序设计时,通常需要以下几个步骤:1. 定义问题的优化目标。
2. 将问题分解成子问题,并设计子问题的解决方案。
3. 设计贪心选择策略,选择局部最优解。
4. 设计贪心算法的递推或迭代公式。
5. 判断贪心算法是否能够得到全局最优解。
6. 编写程序实现贪心算法。
6.贪心算法是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。
贪心算法基本步骤
![贪心算法基本步骤](https://img.taocdn.com/s3/m/404d73cc0342a8956bec0975f46527d3240ca6c7.png)
贪心算法基本步骤贪心算法是一种非常常用的算法思想,广泛应用于算法设计中。
本文将介绍贪心算法的基本步骤、实现方式、应用场景以及优缺点。
一、基本步骤贪心算法的基本步骤可概括为:定义最优解的性质->利用贪心策略获得局部最优解->将局部最优解合并成一个整体最优解。
具体来说,一般包括以下几个步骤:1. 确定问题的最优解性质:要知道问题的最优解应该具有怎样的性质或特征,这些性质可以用于判断一个解是否符合规则或结果是否符合要求。
2. 构造候选解集:根据最优解的性质,不断构造可行的候选解集合,并通过一定的方法筛选出其中的解。
3. 选择最优解:从候选解集中选择一个最优解。
4. 验证最优解:通过验证最优解是否合法(满足约束条件)以及是否为问题的最优解,来验证贪心策略的正确性。
二、实现方式贪心算法的实现方式是比较灵活的,有些问题可以通过贪心策略来解决,有些则不行。
一般而言,如果问题的最优解具有贪心选择性质(即每一步的局部最优解能导致全局最优解),则采用贪心策略是可行的。
对于一些场景,我们可以通过规律来得到贪心策略。
例如:1. 集合覆盖问题:从未被覆盖的地方中选择一个覆盖点集最大的点,并删除所有覆盖的集合;2. 分数背包问题:选择性价比最高的物品,先吸纳尽量多的物品,再考虑其他物品。
三、应用场景1. 背包问题:针对背包问题和其变种,常见的贪心策略有分数背包(与完全和01背包有区别)和完全背包问题;2. 活动安排问题:在一些课程、项目或活动间选择,使得能够安排最多活动;3. 区间选择问题:在一些区间间选择相互不重叠的区间,使得能够选出最大的区间数;4. 集合覆盖问题:在一些集合中选择最少的集合,使得能够覆盖所有元素。
四、优缺点优点:1. 算法简单:贪心算法通常比较简单,易于理解和实现;2. 运算速度快:其时间复杂度一般较低,运算速度很快;3. 可以作为其他算法的优化:贪心策略可以应用于其他算法的优化中。
缺点:1. 不一定能够得到最优解:贪心策略仅考虑当前的局部最优解,对于全局最优解可能产生影响;2. 单一性:贪心算法的结果是唯一的,难以应对变化条件的需要,一旦局部最优解不满足当前的情况,算法就会失去原先的效果;3. 实现困难:对于有些问题,贪心算法并不是很好实现,涉及到更多的问题分析和模型的构造。
贪心算法通过每次选择局部最优解来达到全局最优
![贪心算法通过每次选择局部最优解来达到全局最优](https://img.taocdn.com/s3/m/2eadce5cfe00bed5b9f3f90f76c66137ee064fed.png)
贪心算法通过每次选择局部最优解来达到全局最优贪心算法是一种常用的解决优化问题的算法。
它通过每次选择局部最优解来达到全局最优的目标。
在本文中,我们将介绍贪心算法的原理、应用场景以及优缺点。
一、原理贪心算法的基本原理非常简单:每一步都选择当前状态下的局部最优解,最终得到的结果就是全局最优解。
贪心算法不考虑过去的选择对未来的影响,只关注眼前的最佳选择。
二、应用场景贪心算法在各个领域都有广泛的应用,下面我们将以几个常见的实际问题来说明。
1. 图的最小生成树问题在一个连通无向图中,找到一个包含所有节点且权值最小的无回路子图,这个问题称为最小生成树问题。
贪心算法可以通过每次选择权值最小的边来逐步构建最小生成树。
2. 分糖果问题有一组孩子和一组糖果,每个孩子有一个需求因子和每个糖果有一个大小。
当糖果的大小不小于孩子的需求因子时,孩子可以获得该糖果。
目标是尽可能多地满足孩子的需求,贪心算法可以通过给每个孩子分配满足其需求因子的最小糖果来达到最优解。
3. 区间调度问题给定一个任务列表,每个任务有一个开始时间和结束时间。
目标是安排任务的执行顺序,使得尽可能多的任务能够被完成。
贪心算法可以通过选择结束时间最早的任务来实现最优解。
以上只是一些贪心算法的应用场景,实际上贪心算法可以用于解决各种优化问题。
三、优缺点1. 优点①简单:贪心算法的思路相对简单,容易理解和实现。
②高效:由于只考虑局部最优解,贪心算法的时间复杂度较低,通常能够在较短的时间内得到一个接近最优解的结果。
③可用于近似求解:由于贪心算法不保证得到全局最优解,但可以用于求解近似最优解的问题。
2. 缺点①不保证全局最优解:贪心算法只考虑眼前的最优选择,无法回溯和修正过去的选择,因此不能保证得到全局最优解。
②局部最优解无法转移:在某些情况下,局部最优解并不一定能够转移到全局最优解,导致贪心算法得到的结果偏离最优解。
③对问题的要求较高:由于贪心算法需要找到适合的局部最优解,因此问题必须具备一定的特殊性,而一些问题无法使用贪心算法解决。
供应链管理中配送路线规划算法的使用教程
![供应链管理中配送路线规划算法的使用教程](https://img.taocdn.com/s3/m/69e9ffc682d049649b6648d7c1c708a1294a0a6a.png)
供应链管理中配送路线规划算法的使用教程随着电子商务的兴起和物流行业的快速发展,供应链管理中的配送路线规划算法变得尤为重要。
准确的配送路线规划能够提高物流效率,降低成本,为企业节约时间和资源。
本文将介绍供应链管理中常用的一些配送路线规划算法,并详细说明它们的使用教程。
一、贪心算法贪心算法是一种简单而常用的算法,它在每一步都做出当前最优的选择,但并不保证全局最优解。
在配送路线规划中,贪心算法可以按照以下步骤进行:1.确定起点和终点:首先确定货物的起点和终点,通常是仓库和客户的地址。
2.计算距离矩阵:根据起点、终点和中间所有点的地址,计算出它们之间的距离矩阵。
3.选择最近邻居:从起点开始,选择距离最近的邻居作为下一个节点,将其添加到路径中。
4.更新路径和距离:将新节点添加到路径中,更新距离矩阵,重复步骤3,直到到达终点。
5.输出最优路径:输出路径和距离,路径即为货物的配送路线。
贪心算法的优点在于简单易懂,计算速度快。
然而,它的缺点是可能陷入局部最优解,不能保证得到最优的配送路线。
二、遗传算法遗传算法是一种模拟自然界进化过程的启发式优化算法。
在配送路线规划中,遗传算法可以按照以下步骤进行:1.初始化种群:根据货物的起点和终点,随机生成初始解作为种群。
2.计算适应度:根据候选解的质量,计算每个解的适应度值,一般可以使用总路程作为适应度函数。
3.选择操作:根据适应度值,按照一定的选择策略选出优秀的个体作为父代。
4.交叉操作:通过交叉操作生成新的子代个体,将父代的染色体片段互换,并保留优秀的基因。
5.变异操作:对子代个体进行变异操作,引入新的基因,增加算法的搜索空间。
6.更新种群:将父代和子代个体结合,形成新的种群。
7.重复步骤3-6:重复执行3-6步骤,直到满足停止准则。
8.输出最优解:输出适应度最优的个体,作为货物的配送路线。
遗传算法的优点在于能够全局搜索和优化,有较高的收敛性和适应性。
然而,它的缺点是计算复杂度较高,需要耗费更多的时间和计算资源。
贪心算法模板
![贪心算法模板](https://img.taocdn.com/s3/m/e153f0a3b9f67c1cfad6195f312b3169a551ea55.png)
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。
贪心算法并不总是得到问题的最优解,但对许多问题它能产生整体最优解或整体最优解的近似解。
下面是一个简单的贪心算法模板,用于解决一些优化问题:pythondef greedy_algorithm(input_data):# 初始化结果变量result = []# 根据输入数据的特性进行排序或预处理sorted_data = sort_or_preprocess(input_data)# 遍历排序后的数据for item in sorted_data:# 检查是否满足某个条件,例如是否可以选择该元素if can_choose(item, result):# 如果满足条件,则选择该元素并更新结果result.append(item)# 可能还需要执行一些额外的操作,例如更新状态或计数器update_state(result, item)return result# 根据具体问题的需要,实现排序或预处理函数def sort_or_preprocess(input_data):# 对输入数据进行排序或预处理pass# 根据具体问题的需要,实现选择条件函数def can_choose(item, result):# 检查是否可以选择该元素pass# 根据具体问题的需要,实现状态更新函数def update_state(result, item):# 更新状态或计数器pass请注意,这只是一个通用的贪心算法模板,具体实现会根据问题的不同而有所变化。
在实际应用中,你需要根据问题的特点来设计合适的排序、选择和状态更新策略。
同时,也需要验证贪心策略是否能够得到全局最优解,或者是否能够得到满意的近似解。
1。
任务分配问题算法
![任务分配问题算法](https://img.taocdn.com/s3/m/f07f3f3a30b765ce0508763231126edb6f1a76e3.png)
任务分配问题算法一、引言在许多实际问题中,我们经常需要将一组任务分配给一组工人。
例如,在一个生产系统中,我们需要将一批产品组装任务分配给一组工人;在项目管理中,我们需要将一系列项目工作分配给一组项目经理。
这些问题通常被称为任务分配问题或作业分配问题。
解决这类问题的一个关键步骤是设计有效的任务分配算法。
本文将详细介绍一种常见的任务分配问题算法。
二、任务分配问题描述任务分配问题可以形式化为一个优化问题。
假设我们有n个任务和m个工人,每个任务i有一个执行时间t_i,每个工人j有一个处理能力c_j。
目标是找到一个任务分配方案,使得所有任务的总完成时间最小。
三、任务分配问题算法1. 贪心算法:贪心算法是一种简单但有效的任务分配算法。
它的基本思想是每一步都选择当前最优的任务分配方案。
具体来说,对于每一个还未分配的任务,我们都找出剩余的工人中处理能力最大的那个,然后将这个任务分配给他。
重复这个过程,直到所有的任务都被分配完。
2. 动态规划算法:动态规划算法是一种更复杂的任务分配算法。
它的基本思想是将任务分配问题分解为一系列的子问题,然后从最简单的子问题开始,逐步求解出整个问题的解。
具体来说,我们可以定义一个二维数组dp[i][j],表示前i个任务分配给前j个工人的最小总完成时间。
然后,我们可以用一个嵌套循环来填充这个数组。
外层循环遍历所有的任务,内层循环遍历所有的工人。
对于每一个任务i和工人j,我们可以选择将这个任务分配给这个工人,也可以选择不分配。
如果我们选择将这个任务分配给这个工人,那么dp[i][j]就等于dp[i-1][j-1]加上t_i 和c_j的较小值;如果我们选择不分配,那么dp[i][j]就等于dp[i-1][j]。
最后,dp[n][m]就是我们要求的答案。
3. 分支定界算法:分支定界算法是一种更高效的任务分配算法。
它的基本思想是通过搜索解空间的所有可能解,来找到最优解。
为了减少搜索的空间大小,我们可以使用一些启发式信息来确定哪些解是“好的”,哪些解是“坏的”。
Python中的贪心算法
![Python中的贪心算法](https://img.taocdn.com/s3/m/2f0c6f130166f5335a8102d276a20029bc646341.png)
Python中的贪心算法贪心算法是一种简单而有效的算法,通常用于对最优解进行近似求解。
它通过不断地做出最合适的选择来达到全局最优解的近似,而不是对整个问题进行全面的评估。
贪心算法的核心思想是:在每一步中都选择当前最优的解决方案,然后再尝试将其与其他已选择的解决方案组合起来,得到更优的解决方案。
这种方法通常很容易实现,并且可以得到符合实际使用的结果。
但是,贪心算法并不总是能够得到全局最优解,有时会出现选择局部最优解而导致全局最优解无法实现的情况。
贪心算法的应用范围非常广泛,它可用于优化问题、图形问题、字符串问题等各种领域,并且还可以与其他算法组合使用。
例如,贪心算法可以与动态规划算法结合使用,以加快计算速度并得到更好的结果。
贪心算法通常有以下几个基本步骤:1.确定问题的最优子结构贪心算法的第一步是确定问题是否具有最优子结构。
它意味着,在问题的任何阶段,我们都可以通过选择当前最优的子问题解决方案来获得最优解决方案。
这样,我们就可以逐步地将问题分解为更小、更容易处理的子问题。
2.确定问题的贪心选择性质贪心算法的第二步是确定问题的贪心选择性质。
它意味着我们必须找到一种方法来使每一步的贪心选择都是局部最优的,并且能够达到全局最优解。
这通常需要我们对问题进行更深入的分析,以找到那些能够获得最高收益的解决方案。
3.构造整体最优解贪心算法的最后一步是使用贪心选择性质,逐步构造全局最优解。
这意味着我们在每一步中都要做出当前最优的选择,并将其添加到我们的解决方案中,直到得到整个问题的最优解。
下面我们将简单介绍一下贪心算法在不同领域的应用。
【1】组合优化问题在组合优化问题中,贪心算法通常用于通过寻找不断优化的局部解决方案来构建更好的全局解决方案。
例如,在背包问题中,我们要选择一些物品放入背包中,以使得它们的总重量不超过背包的容量,同时价值最高。
使用贪心算法,我们可以按照物品的价值密度(即物品的价值与重量之比)进行排序,然后选择具有最高价值密度的物品,以使得我们可以尽可能地放入更多的物品,并尽可能地增加总价值。
数字凑数算法
![数字凑数算法](https://img.taocdn.com/s3/m/d131cf7df011f18583d049649b6648d7c1c70882.png)
数字凑数算法数字凑数算法是一种通过组合给定的数字,使其相加等于目标数字的数学计算方法。
这个算法可以应用在各种领域,例如货币找零、组合优化等。
在本文中,我将介绍两种常见的数字凑数算法:贪心算法和动态规划算法。
一、贪心算法贪心算法是一种简单而直观的算法,它通过每次选择当前最优解来得到全局最优解。
在数字凑数的问题中,贪心算法是基于数字的大小来进行求解的。
具体步骤如下:1. 将给定的数字按照从大到小的顺序排列;2. 从最大的数字开始尝试凑数,如果当前数字小于等于目标数字,则将该数字加入结果中,并将目标数字减去当前数字;3. 继续选择当前最大的数字进行尝试,直到目标数字为0。
虽然贪心算法在一些特定情况下能够得到最优解,但并不适用于所有情况。
例如,当给定的数字集合中存在不互质的数字时,贪心算法可能无法得到最优解。
因此,在某些情况下,我们需要考虑使用动态规划算法。
二、动态规划算法动态规划算法是一种将大问题拆分成子问题并求解的方法。
在数字凑数的问题中,动态规划算法可以通过构建一个状态转移表来求解。
具体步骤如下:1. 创建一个二维数组dp,它的行数为数字的个数加1,列数为目标数字加1;2. 初始化dp的第一行为0,表示不使用任何数字时的解为0;3. 初始化dp的第一列为1,表示当目标数字为0时,只有一种解法,即不使用任何数字;4. 从dp的第二行和第二列开始,使用状态转移方程dp[i][j] = dp[i-1][j] +dp[i][j-numbers[i-1]]来计算dp数组的值,其中numbers[i-1]表示第i个数字;5. 最终,dp的最后一个元素dp[numbers.length][target]即为所求的解。
动态规划算法的时间复杂度为O(n*target),其中n为数字的个数,target为目标数字。
由于需要构建一个二维数组,所以空间复杂度为O(n*target)。
三、总结数字凑数算法是一种通过组合给定的数字,使其相加等于目标数字的数学计算方法。
贪心算法的应用案例
![贪心算法的应用案例](https://img.taocdn.com/s3/m/fd11124b8f9951e79b89680203d8ce2f006665ce.png)
贪心算法的应用案例贪心算法是一种简单直观的算法策略,用于解决一些优化问题。
它的基本思想是在每一步选择中都选择当前状态下的最优解,以期望最终达到全局最优解。
本文将通过几个具体的应用案例来展示贪心算法的实际应用。
1. 最小生成树问题最小生成树问题是图论中经典的问题之一,主要涉及到如何在一个连通加权无向图中找到一个包含所有顶点且权重最小的树。
其中,贪心算法的应用使得问题的解决更加高效。
例如,我们有一个城市网络,城市之间的距离用边的权重表示,我们希望在城市之间建立最小的铁路网络以确保每个城市都能够连通。
这可以转化为一个最小生成树问题,其中贪心算法通过选择权重最小的边,快速找到最优解。
2. 零钱兑换问题零钱兑换问题是一个经典的动态规划问题,但同样可以使用贪心算法来解决。
给定一定面值的硬币,我们需要找零某个金额的钱,求出所需硬币的最少数量。
贪心算法解决这个问题的思路是,每次选择价值最大的硬币,直到凑够所需的金额。
这样可以保证得到的结果是最优解。
例如,假设我们有面值为[1, 5, 10, 25]的硬币,需要凑够30美分,贪心算法会优先选择25美分硬币,然后再选择5美分硬币,最后选择1美分硬币,总共需要三枚硬币。
贪心算法快速获得了最优解。
3. 区间调度问题区间调度问题是一类经典的贪心算法问题,主要涉及到如何在一组任务中选择最大数量的相容任务。
每个任务都有一个开始时间和结束时间,任务之间不能同时进行,我们需要找到最大数量的任务能够不发生冲突地进行。
贪心算法解决这个问题的思路是,每次选择结束时间最早的任务,然后排除与其冲突的任务,直到没有任务可选为止。
这样就能够保证选择的任务最多且不发生冲突。
例如,假设我们有以下任务与其对应的开始时间和结束时间:A(1, 4),B(3, 6),C(5, 7)。
贪心算法会先选择A(1, 4),然后排除与其冲突的任务B(3, 6),最后剩下任务C(5, 7)。
贪心算法得到了最大数量的相容任务。
计算机竞赛常用算法
![计算机竞赛常用算法](https://img.taocdn.com/s3/m/6788e3f8970590c69ec3d5bbfd0a79563c1ed4bb.png)
计算机竞赛常用算法在计算机竞赛中,算法的使用至关重要。
计算机竞赛常用算法是指在竞赛中经常被使用的算法,具有高效性和准确性。
本文将介绍几种常见的计算机竞赛常用算法,并对每种算法进行简要的解释和实例分析。
一、贪心算法贪心算法是一种简单而常用的算法。
它的基本思想是通过在每一步中做出局部最优的选择,最终达到全局最优解。
贪心算法常用于优化问题,如背包问题、最短路径问题等。
具体实现时,需要确定问题的子结构和贪心选择性质。
例如,在背包问题中,我们希望在限定重量下,选取一些物品使得总价值最大化。
贪心算法可以选择每次选取质量最轻的物品,直到达到限定重量或物品被选完。
这种策略保证了每次操作都是最优的。
二、动态规划算法动态规划算法常用于解决具有重叠子问题和最优子结构特性的问题。
它通过将原问题分解成若干个子问题,并保存子问题的解,最终得到原问题的解。
动态规划算法常用于最长公共子序列问题、背包问题、最短路径问题等。
以最长公共子序列问题为例,我们需要找到两个序列的最长公共子序列。
动态规划算法可以通过构建一个二维数组,保存子问题的解。
通过填充数组,我们可以找到两个序列的最长公共子序列。
三、深度优先搜索算法深度优先搜索算法用于解决图和树的遍历问题。
它的基本思想是从一个节点开始,依次探索其他相邻节点,直到无法继续探索为止,然后回溯到上一个节点,继续探索其他未访问的节点。
深度优先搜索算法常用于解决迷宫问题、拓扑排序等。
例如,在迷宫问题中,我们需要找到从起点到终点的路径。
深度优先搜索算法可以通过递归或栈的方式实现。
通过不断地向前探索,直到找到终点或无法继续探索,然后回溯到上一个节点,继续探索其他路径。
四、广度优先搜索算法广度优先搜索算法也用于解决图的遍历问题,但与深度优先搜索算法不同,它按照广度方向优先遍历节点。
它的基本思想是从起始节点开始,逐层地向外扩展搜索,直到找到目标节点或搜索完所有节点。
广度优先搜索算法常用于解决最短路径问题、连通性问题等。
使积最大,使积最小的方法
![使积最大,使积最小的方法](https://img.taocdn.com/s3/m/c57b216f443610661ed9ad51f01dc281e53a56cb.png)
使积最大,使积最小的方法使积最大的方法:在数学中,求解最大值问题是一个非常重要的问题。
在实际生活中,我们经常需要求解最大值问题,比如说我们需要在有限的时间内完成尽可能多的工作,或者我们需要在有限的预算内购买尽可能多的商品等等。
在这些问题中,我们需要找到一种方法,使得我们能够获得最大的收益或者利润。
同样的,当我们需要求解一个数列的最大乘积时,我们也需要找到一种方法,使得我们能够获得最大的乘积。
在这里,我们将介绍一些方法,可以帮助我们求解一个数列的最大乘积。
1. 贪心算法贪心算法是一种简单而有效的算法,它可以用来求解最大乘积问题。
在这种算法中,我们首先将数列按照从小到大的顺序排序,然后从左到右遍历数列,每次选择当前数列中的最大值,并将其乘以前面已经选择的数的乘积。
这样,我们就可以得到一个最大的乘积。
例如,对于数列{1, 2, 3, 4, 5},我们可以按照从小到大的顺序排序,得到{1, 2, 3, 4, 5}。
然后,我们从左到右遍历这个数列,每次选择当前数列中的最大值,并将其乘以前面已经选择的数的乘积。
具体来说,我们可以选择1,然后选择2,然后选择3,然后选择4,最后选择5。
这样,我们就可以得到一个最大的乘积,即5×4×3×2×1=120。
2. 动态规划动态规划是一种常用的算法,它可以用来求解最大乘积问题。
在这种算法中,我们首先定义一个状态数组,用来存储每个位置的最大乘积。
然后,我们从左到右遍历数列,对于每个位置,我们都计算出它的最大乘积,并将其存储到状态数组中。
最后,我们返回状态数组中的最大值。
例如,对于数列{1, 2, 3, 4, 5},我们可以定义一个状态数组dp,其中dp[i]表示以第i个位置结尾的最大乘积。
然后,我们从左到右遍历这个数列,对于每个位置i,我们都计算出它的最大乘积,并将其存储到状态数组dp中。
具体来说,我们可以使用以下公式计算dp[i]:dp[i] = max(dp[i-1]×nums[i], nums[i])其中,nums[i]表示第i个位置的值,dp[i-1]表示以第i-1个位置结尾的最大乘积。
贪心算法总结
![贪心算法总结](https://img.taocdn.com/s3/m/b381f40c17fc700abb68a98271fe910ef12dae9b.png)
贪⼼算法总结简介贪⼼算法(英⽂:greedy algorithm),是⽤计算机来模拟⼀个“贪⼼”的⼈做出决策的过程。
这个⼈⼗分贪婪,每⼀步⾏动总是按某种指标选取最优的操作。
⽽且他⽬光短浅,总是只看眼前,并不考虑以后可能造成的影响。
可想⽽知,并不是所有的时候贪⼼法都能获得最优解,所以⼀般使⽤贪⼼法的时候,都要确保⾃⼰能证明其正确性。
本⽂主要介绍,在解决诸多贪⼼算法的问题之后的⼼得。
常⽤场景最常见的贪⼼算法分为两种。
「我们将 XXX 按照某某顺序排序,然后按某种顺序(例如从⼩到⼤)选择。
」。
「我们每次都取 XXX 中最⼤/⼩的东西,并更新 XXX。
」(有时「XXX 中最⼤/⼩的东西」可以优化,⽐如⽤优先队列维护)第⼀种是离线的,先处理后选择,第⼆种是在线的,边处理边选择。
常见的出题背景为:确定某种最优组合(硬币问题)区间问题(合理安排区间)字典序问题最值问题A最优组合硬币问题是贪⼼算法⾮常经典的题⽬,关于最优组合问题,我认为主要分为两种类型:简单 -- 直接排序之后按照某种策略选取即可复杂 -- 除了按照贪⼼策略外,还需要进⾏某些处理或者模拟硬币问题硬币问题有1元、5元、10元、50元、100元、500元的硬币各C1、C5、C10、C50、C100、C500枚。
现在要⽤这些硬币来⽀付A元,最少需要多少枚硬币?假设本题⾄少存在⼀种⽀付⽅法。
0≤C1、C5、C10、C50、C100、C500≤1090≤A≤109本题是上述说的简单类型的题⽬,简⽽⾔之要使得硬币最少,则优先使⽤⼤⾯额的硬币。
因此本题的解法便⾮常清晰了,只需要从后往前遍历⼀遍即可(默认为硬币已经按⾯额⼤⼩进⾏排序)const int V[6] = {1, 5, 10, 50, 100, 500};int A, C[6]; // inputvoid solve(){int ans(0);for (int i = 5; i >= 0; -- i){int t = min(A / V[i], C[i]);A -= t * V[i];ans += t;}cout << ans << '\n';}零花钱问题POJ3040 AllowanceDescriptionAs a reward for record milk production, Farmer John has decided to start paying Bessie the cow a small weekly allowance. FJ has a set of coins in N (1 <= N <= 20) different denominations, where each denomination of coin evenly divides the next-larger denomination (e.g., 1 cent coins, 5 cent coins, 10 cent coins, and 50 cent coins).Using the given set of coins, he would like topay Bessie at least some given amount of money C (1 <= C <= 100,000,000) every week.Please help him ompute the maximum number of weeks he can pay Bessie.Input* Line 1: Two space-separated integers: N and C* Lines 2..N+1: Each line corresponds to a denomination of coin and contains two integers: the value V (1 <= V <= 100,000,000) of the denomination, and the number of coins B (1 <= B <= 1,000,000) of this denomation in Farmer John's possession.Output* Line 1: A single integer that is the number of weeks Farmer John can pay Bessie at least C allowanceSample Input3 610 11 1005 120Sample Output111这题的题⽬⼤意是:农场主每天都要给贝西⾄少为C的津贴。
java贪心算法几个经典例子
![java贪心算法几个经典例子](https://img.taocdn.com/s3/m/9da2383977c66137ee06eff9aef8941ea76e4bd6.png)
java贪心算法几个经典例子1. 跳跃游戏跳跃游戏是一个非常简单的贪心算法问题,概括来说,它的目标是将一些数列中的数字与它们的下标相加,然后通过一定的规则从开始位置向后跳跃,直到跳到数组的最后一个位置。
在这个过程中,我们需要决定每一步要跳多远才能尽可能地跳到数组的最后一个位置。
具体来说,我们需要维护两个变量:一个表示目前能够跳的最远距离,另一个表示如果一步跳完所能到达的最远位置。
对于每一步,我们需要计算出在当前位置能够跳的最远距离,然后从这个范围中选出下一步的最佳位置,直到最终到达数组的结尾。
代码实现如下:```public boolean canJump(int[] nums) {int n = nums.length;int farthest = 0;for (int i = 0; i < n; i++) {if (i <= farthest) {farthest = Math.max(farthest, i + nums[i]);if (farthest >= n - 1) return true;}}return false;}```2. 最佳买卖股票时机在这个问题中,我们需要决定什么时候买入股票并在价值最高的时候卖出。
我们可以利用贪心算法来解决这个问题。
具体来说,我们需要维护两个变量:一个表示目前为止的最小股票价格,另一个表示目前为止的最大利润。
在遍历数组的过程中,我们将最小股票价格与当前价格进行比较,并尝试更新最大利润。
代码实现如下:```public int maxProfit(int[] prices) {int minPrice = Integer.MAX_VALUE;int maxProfit = 0;for (int price : prices) {if (price < minPrice) {minPrice = price;} else if (price - minPrice > maxProfit) {maxProfit = price - minPrice;}}return maxProfit;}```3. 分配饼干这个问题是关于如何将一些饼干分配给孩子们以使得他们获得最大的满足感。
贪心算法-例题讲解
![贪心算法-例题讲解](https://img.taocdn.com/s3/m/c0f1040eb6360b4c2e3f5727a5e9856a56122647.png)
贪⼼算法-例题讲解前⾔:此博客在写作过程中参考了⼤量资料和博客,不能⼀⼀列举,还请见谅。
概述贪⼼法:从问题的某⼀个初始状态出发,逐步构造最优解从⽽向⽬标前进,并期望通过这种⽅法产⽣出⼀个全局最优解的⽅法贪⼼是⼀种解题策略,也是⼀种解题思想,⽽不是算法贪⼼策略与其他算法的区别贪⼼与递推:贪⼼法推进每⼀步不依据某⼀固定的递推式,⽽是当前看似最佳的贪⼼决策,不断的将问题归纳为更加⼩的相似的⼦问题贪⼼与动态规划:贪⼼是“⿏⽬⼨光”;动态规划是“统揽全局”贪⼼法的优缺点优点:思维复杂度低、代码量⼩、运⾏效率⾼、空间复杂度低等缺点:很难找到⼀个简单可⾏并且保证正确的贪⼼思路贪⼼算法的应⽤贪⼼算法的常⽤范围有明显的贪⼼可证明贪⼼策略的贪⼼(最常见的)贪⼼数据结构:堆/Kruskal/Prim/Dijkstra博弈/游戏策略,这些策略⼤多是贪⼼求较优解或多次逼近求最优解⼏个简单的贪⼼例⼦最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C贪⼼策略:先拿轻的部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量⾼。
每⼀个物体可以只取⾛⼀部分,价值和重量按⽐例计算贪⼼策略:先拿性价⽐⾼的乘船问题:有n个⼈,第i个⼈重量为wi。
每艘船的载重量均为C,最多乘两个⼈。
⽤最少的船装载所有⼈贪⼼策略:最轻的⼈和最重的⼈配对例题(基础)1.删数问题-【问题描述】键盘输⼊⼀个⾼精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成⼀个新的正整数。
编程对给定的n和s,寻求⼀种⽅案,使得剩下组成的新数最⼩。
贪⼼策略为:每⼀步总是选择⼀个使剩下的数最⼩的数字删去,即按⾼位到低位的顺序搜索,若各位数字递增,则删除最后⼀个数字,否则删除第⼀个递减区间的⾸字符。
然后回到串⾸,按上述规则再删除下⼀个数字。
重复以上过程s次,剩下的数字串便是问题的解了。
供应链管理中的订单分配优化算法
![供应链管理中的订单分配优化算法](https://img.taocdn.com/s3/m/5546ffda50e79b89680203d8ce2f0066f5336422.png)
供应链管理中的订单分配优化算法在现代商业运作中,供应链管理扮演着重要的角色。
供应链管理旨在通过优化供应链中的各个环节,提高整个供应链的效率和效益。
其中,订单分配是供应链管理中的关键环节之一,它涉及到将来自客户的订单分配给不同的供应商或分销商,以满足客户需求并最大化供应链的整体效益。
为了实现有效的订单分配,优化算法被广泛应用。
订单分配的目标是合理分配订单,使得订单可以按照最佳的方式被处理。
优化算法在此过程中发挥重要作用,通过数学模型和计算方法,找到最佳的分配方案。
下面将介绍几种常用的供应链管理中的订单分配优化算法。
1. 贪心算法贪心算法是一种简单而常用的优化算法,它根据当前的情况做出局部最优的选择。
在订单分配中,贪心算法可以根据一定的策略选择最符合条件的供应商或分销商来处理订单。
例如,可以选择距离最近的供应商处理订单,或者选择存货量最充足的供应商。
贪心算法的优势在于计算简单、速度快,但可能无法得到全局最优解。
2. 动态规划算法动态规划算法通过递推的方式,将原问题拆解为多个子问题,并保存已解决的子问题的最优解。
在订单分配中,可以将订单分配问题转化为子问题,通过动态规划算法找到最佳的分配方案。
动态规划算法需要存储大量的中间结果,计算时间较长,但可以得到全局最优解。
3. 遗传算法遗传算法是一种模仿自然界中生物进化过程的优化算法。
在订单分配中,可以将订单分配方案看作是一个个体的染色体,通过模拟自然选择、交叉和变异等操作,逐步优化分配方案。
遗传算法具有全局搜索能力,能够找到相对较优的解,但计算时间较长。
4. 禁忌搜索算法禁忌搜索算法通过维护一个禁忌表,记录已经搜索过但不宜再次选择的解,从而避免陷入局部最优解。
在订单分配中,可以使用禁忌搜索算法来避免重复选择供应商或分销商,以达到更优的分配方案。
禁忌搜索算法具有较好的局部搜索能力,并可以在一定程度上得到全局最优解。
综上所述,供应链管理中的订单分配优化算法有多种选择,包括贪心算法、动态规划算法、遗传算法和禁忌搜索算法等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
——电影《华尔街》
算法思想ﻻ
将问题的求解过程看作是一系列选择,每 次选择一个输入,每次选择都是当前状态下的 最好选择(局部最优解)。每作一次选择后,所 求问题会简化为一个规模更小的子问题。从而 通过每一步的最优解逐步达到整体的最优解。
真正意义要求解原问题
将原问题变成更小 子问题的步骤
理解
算法过程ﻻ
【贪心算法一般步骤】
1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明)
·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
算法分析ﻻ
【适用问题】 具备贪心选择和最优子结构性质的最优化
问题
整体的最优解可通过一系列 局部最优解达到. 每次的选择 可以依赖以前作出的选择, 但 不能依赖于后面的选择
算法过程ﻻ
顾名思义,贪心算法总是作出在当前看来最 好的选择。也就是说贪心算法并不从整体最优考 虑,它所作出的选择只是在某种意义上的局部最 优选择。
【标准转化】 贪心猜想(贪心策略)
找硬币的时候:
找的硬币总数最少→使剩余金额最少
原
现
算法过程ﻻ
[贪心算法步骤]
从问题的某一初始解出发; while 能朝给定总目标前进一 步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个 可行解;
※简谈: 算法思想 算法过程 算法分析
※应用举例:
常见应用
算法思想ﻻ
引例——找零钱
找钱的方法: 25+25+10+5+1+1
我们有种直觉的倾向:
在找零钱时,直觉 告诉我们使用面值大的硬 币,剩余的金额就越少, 这样找的硬币数目最少。
算法思想ﻻ
在现实生活中,我们经常为下意 识的做贪心的选择,例如在购买商品 时候总是寻求物美价廉的物品,在质 量相同情况下,价格低的首选。
2020/11/26
11
有八种字符:a b c d e f g h ,其在通信联络中出现的概率分别为: 0.05 0.29 0.07 0.08 0.14 0.23 0.03 0.11 ,试设计哈夫曼编码。
设权 w = ( 5 , 29 , 7 ,8 , 14 , 23 ,3 , 11) n = 8
A[1]=true; int j=1; for (int i=2;i<=n;i++) {
if (s[i]>=f[j]) { A[i]=true; j=i; }
else A[i]=false; } }
常见应用• ﻻ
2、哈夫曼编码
【问题陈述】哈夫曼编码是广泛地用于数据文件压缩的十分有效的 编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字 符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表 示方式。 【算法思路】 (1)以n个字母为结点构成n棵仅含一个点的二叉树集合,字母的 频率即为结点的权。 (2)每次从二叉树集合中找出两个权最小者合并为一棵二叉树: 增加一个根结点将这两棵树作为左右子树。新树的权为两棵子树的 权之和。 (3)反复进行步骤(2)直到只剩一棵树为止。
(3)贪心算法只能确定某些问题的可行性范围。
因此,贪心算法具有局限性,并不是总能得到最优 解。
欢迎老师和同 学们批评指正!
谢谢观看
择了会议i,则它在时间区间[si, fi)内占用该资源;若[si, fi)与[sj, fj)不
相交 , 则称会议 i 与 j 是 相容 的 . 求解目标是在所给的会议集合中 选出最大相容会议子集. 【算法思路】将n个会议按结束时间非减序排列,依次考虑会议i, 若i 与已选择的会议相容,则添加此会议到相容会议子集. 【例】设待安排的11个会议起止时间按结束时间的非减序排列
的数的最大值。
826
解:如果用贪心法,每次向最大的方向 走,
得到结果为1+6+8+2+3=20。可是明明还 2 1 6 5 有另一条路,1+3+6+6+7=23。
问题出在哪?每次的选择对后面的步骤会有 3 2 4 7 6 影响!第三级选了8,就选不到第四、五 级较大的数了。
综述 贪心算法是一种分级处理方法,它得到某种度量意义下
一个问题的最优解,所做的每一次选择都是当前状态下的贪 心选择,通过一系列的选择来得到最终解。这种策略是一种 很简洁的方法,适用于许多问题,但并不能依赖于它,因为 它还有一下不足:
(1)不能保证求得的最后解是最佳的,由于贪
心策略总 是从局部看来是最优的选择,因此从整 体上考虑并不一定是最优解;
(2)贪心算法只能用来求某些最大或最小解的 问题;
问题的整体最优解 中包含着它子问题 的最优解
【常见应用】会议安排问题,哈夫曼编码问题, 等等
【算法优点】求解速度快,时间复杂性有较低的阶.
【算法缺点】需证明是最优解.
常见应用ﻻ
1、会议安排问题
【问题陈述】设有n个会议E={1,2,…,n}要使用同一资源,同一时间内 只允许一个会议使用该资源. 设会议i的起止时间区间[si, fi) ,如果选
构造过程:
5
29
7
8
14 23
3
11
0 100 1
42
0
1
58 1
0
a: 0000 c: 1000 e: 101
b :11 d: 1001 f :01
19
23
29 29 g: 0001 23h:0
1
0
8 0
11 1
209
15 7 1
14 298
14 14
2233 11 11
5
3
7
8
谈谈自己的 想法——
选择需慎重
贪心算法在对问题求解时,总是作出在当前看
来是最好的选择。也就是说,不从整体上加以考虑,
它所作出的仅仅是在某种意义上的局部最优解。
eg:数字三角形问题:有一个数字三角形 1
(如右图)。现有一只蚂蚁从顶层开始
向下走,每走下一级时,可向左下方向 6 3
或右下方向走。求走到底层后它所经 过
事件编号 1 2 3 4 5 6 7 8 9 10 11
发生时刻 1 3 0 5 3 5 6 8 8 2 12
结束时刻 4 5 6 7 8 9 10 11 12 13 14
常见应用ﻻ
会议安排问题贪心算法: void GreedySelector(int n, Type s[], Type f[], bool A[]) {