动态规划算法和贪心算法的比较与分析
数学建模中的动态规划与贪心算法
在现代数学建模中,动态规划和贪心算法是两种常用的方法。
它们具有重要的理论和实际意义,可以在很多实际问题中得到应用。
动态规划是一种通过将问题分解为子问题,并反复求解子问题来求解整个问题的方法。
它的核心思想是将原问题分解为若干个规模较小的子问题,并将子问题的最优解合并得到原问题的最优解。
动态规划的求解过程通常包括问题的建模、状态的定义、状态转移方程的确定、初始条件的设置和最优解的确定等步骤。
通过动态规划方法,可以大大减少问题的求解时间,提高求解效率。
举个例子,假设我们有一组物品,每个物品有重量和价值两个属性。
我们希望从中选出一些物品放入背包中,使得在背包容量限定的条件下,背包中的物品的总价值最大化。
这个问题可以使用动态规划来解决。
首先,我们定义一个状态变量,表示当前的背包容量和可选择的物品。
然后,我们根据背包容量和可选择的物品进行状态转移,将问题分解为子问题,求解子问题的最优解。
最后,根据最优解的状态,确定原问题的最优解。
与动态规划相比,贪心算法更加简单直接。
贪心算法是一种通过每一步的局部最优选择来达到全局最优解的方法。
贪心算法的核心思想是每一步都做出当前看来最好的选择,并在此基础上构造整个问题的最优解。
贪心算法一般包括问题的建模、贪心策略的确定和解的构造等步骤。
尽管贪心算法不能保证在所有情况下得到最优解,但在一些特定情况下,它可以得到最优解。
举个例子,假设我们要找零钱,现有的零钱包括若干2元、5元和10元的硬币。
我们希望找出一种最少的方案来凑出某个金额。
这个问题可以使用贪心算法来解决。
首先,我们确定贪心策略,即每次选择最大面额的硬币。
然后,我们根据贪心策略进行解的构造,直到凑够目标金额。
动态规划和贪心算法在数学建模中的应用广泛,在实际问题中也有很多的成功应用。
例如,动态规划可以用于求解最短路径、最小生成树等问题;贪心算法可以用于求解调度、路径规划等问题。
同时,动态规划和贪心算法也相互补充和影响。
有一些问题既可以使用动态规划求解,也可以使用贪心算法求解。
组合优化问题中的算法设计与分析研究
组合优化问题中的算法设计与分析研究组合优化问题是指那些寻找在给定约束条件下最优组合方案的问题,这类问题在工程、管理、金融等许多领域都有广泛应用。
算法的设计与分析是解决这类问题中至关重要的一环。
本文将重点讨论组合优化问题中的算法设计与分析的研究现状和未来发展。
一、算法设计1.贪心算法贪心算法是一种基于贪心策略的求解优化问题的算法,即从局部最优解出发寻找全局最优解。
该算法思想简单、易于实现,但仅适用于某些特殊情况下,例如最小生成树问题、背包问题等。
然而,针对一些复杂的组合优化问题,贪心算法并不能保证得到全局最优解。
因此,在实际应用中需要结合其他算法使用。
2.动态规划算法动态规划算法是一种基于维护状态转移序列的算法,能够解决包括背包问题、最短路问题等在内的许多组合优化问题。
该算法在实现上较为复杂,需要先确定状态转移方程、状态转移矩阵等,并且需要耗费大量的时间和空间资源。
但是,动态规划算法得到的结果是全局最优解,因此能够比较好地满足实际应用需求。
3.遗传算法遗传算法是一种基于自然进化的算法,模拟自然选择和基因遗传过程来寻找全局最优解。
该算法不要求对问题的数学模型进行精确分析,在实现上相对简便。
但是,遗传算法需要依赖于个体的初始状态,因此对于问题的求解具有随机性和不确定性,并不能保证获得全局最优解。
因此,在设计应用时,需要对算法进行改进和优化。
二、算法分析1.时间复杂度算法的时间复杂度是指算法运行所需的时间与问题规模之间的关系。
对于组合优化问题中的算法,其时间复杂度需要考虑问题规模、算法的设计思路、操作方法等因素。
一般来说,时间复杂度越小的算法会更优秀,对实际应用更具有意义。
因此,在算法设计时需要特别注意时间复杂度的问题。
2.空间复杂度算法的空间复杂度是指算法运行所需的空间资源占用与问题规模之间的关系。
对于组合优化问题中的算法,其空间复杂度也需要考虑问题规模、算法的设计思路、操作方法等因素。
一般来说,空间复杂度越小的算法更为优秀,对实际应用更具有意义。
贪心算法、分治算法、动态规划算法间的比较.doc
题目:贪心算法、分治算法、动态规划算法间的比较贪心算法:贪心算法采用的是逐步构造最优解的方法。
在每个阶段,都在一定的标准下做出一个看上去最优的决策。
决策一旦做出,就不可能再更改。
做出这个局部最优决策所依照的标准称为贪心准则。
分治算法:分治法的思想是将一个难以直接解决大的问题分解成容易求解的子问题,以便各个击破、分而治之。
动态规划:将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。
在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。
依次解决各子问题,最后一个子问题就是初始问题的解。
二、算法间的关联与不同1、分治算法与动态规划分治法所能解决的问题一般具有以下几个特征:①该问题的规模缩小到一定程度就可以容易地解决。
②该问题可以分为若干个较小规模的相似的问题,即该问题具有最优子结构性质。
③利用该问题分解出的子问题的解可以合并为该问题的解。
④该问题所分解出的各个子问题是相互独立的且子问题即之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是分治法应用的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划算法;第四条特征涉及到分治法的效率,如果各个子问题不是独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。
这类问题虽然可以用分治法解决,但用动态规划算法解决效率更高。
当问题满足第一、二、三条,而不满足第四条时,一般可以用动态规划法解决,可以说,动态规划法的实质是:分治算法思想+解决子问题冗余情况2、贪心算法与动态规划算法多阶段逐步解决问题的策略就是按一定顺序或一定的策略逐步解决问题的方法。
动态规划和贪心算法的时间复杂度分析比较两种算法的效率
动态规划和贪心算法的时间复杂度分析比较两种算法的效率动态规划和贪心算法是常见的算法设计思想,它们在解决问题时具有高效性和灵活性。
但是,两者在时间复杂度上有所不同。
本文将对动态规划和贪心算法的时间复杂度进行详细分析,并比较这两种算法的效率。
一、动态规划算法的时间复杂度分析动态规划是一种通过将问题分解成子问题并保存子问题的解来求解的算法。
其时间复杂度主要取决于子问题的数量和每个子问题的求解时间。
1. 子问题数量动态规划算法通常使用一个二维数组来保存子问题的解,数组的大小与原问题规模相关。
假设原问题规模为N,每个子问题的规模为k,则子问题数量为N/k。
因此,子问题数量与原问题规模N的关系为O(N/k)。
2. 每个子问题的求解时间每个子问题的求解时间通常也与子问题的规模相关,假设每个子问题的求解时间为T(k),则整个动态规划算法的时间复杂度可以表示为O(T(k) * N/k)。
综上所述,动态规划算法的时间复杂度可以表示为O(T(k) * N/k),其中T(k)表示每个子问题的求解时间。
二、贪心算法的时间复杂度分析贪心算法是一种通过选择当前最优的解来求解问题的算法。
其时间复杂度主要取决于问题的规模和每个选择的求解时间。
1. 问题规模对于贪心算法来说,问题的规模通常是不断缩小的,因此可以假设问题规模为N。
2. 每个选择的求解时间每个选择的求解时间可以假设为O(1)。
贪心算法通常是基于问题的局部最优解进行选择,而不需要计算所有可能的选择。
因此,每个选择的求解时间可以认为是常数级别的。
综上所述,贪心算法的时间复杂度可以表示为O(N)。
三、动态规划和贪心算法的效率比较从时间复杂度的分析结果来看,动态规划算法的时间复杂度为O(T(k) * N/k),而贪心算法的时间复杂度为O(N)。
可以发现,在问题规模较大时,动态规划算法的时间复杂度更高。
原因在于动态规划算法需要保存所有子问题的解,在解决子问题时需要遍历所有可能的选择,因此时间复杂度较高。
贪心算法和动态规划的区别与联系
贪⼼算法和动态规划的区别与联系
联系
1.都是⼀种推导算法
2.都是分解成⼦问题来求解,都需要具有最优⼦结构
区别
1.贪⼼:每⼀步的最优解⼀定包含上⼀步的最优解,上⼀步之前的最优解则不作保留;
动态规划:全局最优解中⼀定包含某个局部最优解,但不⼀定包含前⼀个局部最优解,因此需要记录之前的所有的局部最优解
2.贪⼼:如果把所有的⼦问题看成⼀棵树的话,贪⼼从根出发,每次向下遍历最优⼦树即可(通常这个“最优”都是基于当前情况下显⽽易见的“最优”);这样的话,就不需要知道⼀个节点的所有⼦树情况,于是构不成⼀棵完整的树;
动态规划:动态规划则⾃底向上,从叶⼦向根,构造⼦问题的解,对每⼀个⼦树的根,求出下⾯每⼀个叶⼦的值,最后得到⼀棵完整的树,并且最终选择其中的最优值作为⾃⾝的值,得到答案
3.根据以上两条可以知道,贪⼼不能保证求得的最后解是最佳的,⼀般复杂度低;⽽动态规划本质是穷举法,可以保证结果是最佳的,复杂度⾼。
4.针对0-1背包问题:这个问题应⽐较选择该物品和不选择该物品所导致的最终⽅案,然后再作出最好选择,由此就导出许多互相重叠的⼦问题,所以⽤动态规划。
计算机网络优化算法
计算机网络优化算法计算机网络优化算法(Computer Network Optimization Algorithms)是指通过使用数学、统计学和计算机科学的方法来优化计算机网络系统的性能和效率。
这些算法的设计主要是为了最大化网络资源的利用率、最小化网络延迟和最优化网络吞吐量。
本文将介绍几种常见的计算机网络优化算法,包括贪心算法、动态规划算法、遗传算法和禁忌搜索算法等。
1. 贪心算法贪心算法是一种基于局部最优选择的算法,它每次在作出选择时都只考虑当前状态下的最优解。
在计算机网络中,贪心算法可以用于一些简单的网络优化问题,如最佳路径选择、带宽分配等。
贪心算法的优点是简单易实现,但缺点是可能会导致局部最优解而非全局最优解。
2. 动态规划算法动态规划算法是一种将复杂问题分解为简单子问题并存储中间结果的算法。
在计算机网络中,动态规划算法可以用于一些具有重叠子问题的优化问题,如最短路径问题、最小生成树问题等。
动态规划算法的优点是能够得到全局最优解,但缺点是其计算复杂度较高。
3. 遗传算法遗传算法是一种模拟生物进化过程的优化算法。
在计算机网络中,遗传算法可以用于解决一些复杂的优化问题,如网络布线问题、拓扑优化问题等。
遗传算法的优点是能够找到较好的全局最优解,但缺点是其计算复杂度高且需要大量的计算资源。
4. 禁忌搜索算法禁忌搜索算法是一种通过记录和管理搜索路径来避免陷入局部最优解的优化算法。
在计算机网络中,禁忌搜索算法可以用于解决一些带有约束条件的优化问题,如链路带宽分配问题、网络拓扑优化问题等。
禁忌搜索算法的优点是能够在可行解空间中进行有效搜索,但缺点是其计算复杂度较高且需要适当的启发式规则。
综上所述,计算机网络优化算法是一类用于改善计算机网络系统性能的关键算法。
选择合适的网络优化算法取决于具体的问题和限制条件。
贪心算法适用于简单的问题,动态规划算法适用于具有重叠子问题的问题,遗传算法适用于复杂的问题,禁忌搜索算法适用于带有约束条件的问题。
贪心算法和动态规划以及分治法的区别?
贪⼼算法和动态规划以及分治法的区别?
贪⼼算法顾名思义就是做出在当前看来是最好的结果,它不从整体上加以考虑,也就是局部最优解。
贪⼼算法从上往下,从顶部⼀步⼀步最优,得到最后的结果,它不能保证全局最优解,与贪⼼策略的选择有关。
动态规划是把问题分解成⼦问题,这些⼦问题可能有重复,可以记录下前⾯⼦问题的结果防⽌重复计算。
动态规划解决⼦问题,前⼀个⼦问题的解对后⼀个⼦问题产⽣⼀定的影响。
在求解⼦问题的过程中保留哪些有可能得到最优的局部解,丢弃其他局部解,直到解决最后⼀个问题时也就是初始问题的解。
动态规划是从下到上,⼀步⼀步找到全局最优解。
(各⼦问题重叠)
分治法(divide-and-conquer):将原问题划分成n个规模较⼩⽽结构与原问题相似的⼦问题;递归地解决这些⼦问题,然后再合并其结果,就得到原问题的解。
(各⼦问题独⽴)
分治模式在每⼀层递归上都有三个步骤:
分解(Divide):将原问题分解成⼀系列⼦问题;
解决(conquer):递归地解各个⼦问题。
若⼦问题⾜够⼩,则直接求解;
合并(Combine):将⼦问题的结果合并成原问题的解。
例如归并排序。
数据结构-贪心算法和动态规划
重复n-1次。
18/65
贪心法的 思考 可以看到,在从Ai到Ai+1的扩展过程中,上
贪心法和动态规划
1/65
主要内 容 动态规划和贪心的认识
工具:马尔科夫过程
贪心法
Prim算法 Kruskal算法 Dijkstra算法
动态规划
最长递增子序列LIS 矩阵连乘的最少乘法 字符串的交替连接 走棋盘/格子取数问题及其应用 带陷阱的走棋盘问题 两次走棋盘问题 Catalan数简介
15/65
贪心 法 根据实际问题,选取一种度量标准。然后按照这种
标准对n个输入排序,并按序一次输入一个量。 如果输入和当前已构成在这种量度意义下的部分最
优解加在一起不能产生一个可行解,则不把此输入 加到这部分解中。否则,将当前输入合并到部分解 中从而得到包含当前输入的新的部分解。 这一处理过程一直持续到n个输入都被考虑完毕, 则记入最优解集合中的输入子集构成这种量度意义 下的问题的最优解。 这种能够得到某种量度意义下的最优解的分级处理 方法称为贪心方法。
是否合法。
如: 2.5.5.25511135,才能判断出是非法的。
当然,它可以通过“25511135”大于“255.255”等其他限界 条件“事先”判断。
10/65
DFS与DP深刻 认识 DFS的过程,是计算完成了str[0…i]的切分,然后
递归调用,继续计算str[i+1,i+2…n-1]的过程; 而DP中,假定得到了str[0…i-1]的所有可能切分方
动态规划算法的优缺点及其应用场景
动态规划算法的优缺点及其应用场景动态规划算法是一种重要的算法思想,广泛应用于计算机科学、数学等领域。
动态规划算法以其高效的运行效率和优秀的求解能力被广泛应用于各种领域,如计算机视觉、自然语言处理、医学数据分析等。
在本文中,我们将讨论动态规划算法的优缺点及其应用场景。
动态规划算法的优点1.高效性:动态规划算法的时间和空间复杂度都相对较低。
与暴力搜索和贪心算法相比,动态规划算法避免了重复计算,可以大大提高效率。
2.适用性:动态规划算法可以解决许多问题,如最长公共子序列问题、最大子段和问题、背包问题等。
在求解这些问题时,动态规划算法可以有效地优化计算时间和空间。
3.求解能力:动态规划算法可以求解最优策略问题。
在某些场景下,贪心算法无法求解最优策略,而动态规划算法可以。
动态规划算法的缺点1.设计复杂:动态规划算法的设计较为复杂,需要对问题进行深入分析,并根据问题特点设计出适合的状态转移方程。
这对于不熟练的程序员来说可能会存在一定的难度。
2.空间占用:在求解某些问题时,动态规划算法可能需要占用较多的内存空间,导致程序运行速度变慢。
3.无法扩展:有些问题直接使用动态规划算法无法求解。
在这种情况下,就需要使用其他算法思想,如回溯算法、分治算法等。
动态规划算法的应用场景1.医学数据分析:在医学领域中,动态规划算法被广泛应用。
例如,它可以用于研究基因序列的匹配和编辑距离问题。
2.计算机视觉:在计算机视觉领域中,动态规划算法被广泛应用于图像处理和目标识别。
例如,它可以用于检测图像的边缘和角点等。
3.自然语言处理:在自然语言处理领域中,动态规划算法可以用于句法分析和语义分析等。
4.图形学:在图形学中,动态规划算法可以用于绘制曲线和曲面。
展望随着技术的不断发展,动态规划算法被广泛应用于各个领域。
未来,我们可以期待动态规划算法的进一步发展,例如在计算机安全、智能交通等领域中的应用。
同时,我们也需要不断探索算法思想和算法模型,提高算法效率和求解能力。
动态规划算法和贪心算法比较和分析
动态规划算法和贪心算法的比较与分析1、最优化原理根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。
解决这类问题的最优化原理:一个过程的最优决策具有这样的性质,即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略。
简而言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。
2、动态规划2.1 动态规划算法动态规划是运筹学的一个分支,与其说它是一种算法,不如说它是一种思维方法更贴切。
因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。
许多隐式图上的算法,例如求单源最短路径的Dijkstra算法、广度优先搜索算法,都渗透着动态规划的思想。
还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。
因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用。
它必须对具体问题进行具体分析、处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。
动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
值得注意的是,用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。
最优化原理是动态规划的基础。
任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。
能采用动态规划求解的问题都要满足两个条件:①问题中的状态必须满足最优化原理;②问题中的状态必须满足无后效性。
所谓无后效性是指下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结。
2.2 动态规划算法的基本要素(1)最优子结构。
设计动态规划算法的第一步通常是刻画最优解的结构。
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。
贪心与动态规划算法的主要区别
贪心算法与动态规划算法的主要区别所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是利用贪心算法求解最优解的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
共同点:求解的问题都具有最优子结构性质差异点:动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。
Prim算法O(n2)首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,将顶点j添加到S中。
这个过程一直进行到S=V时为止。
在这个过程中选取到的所有边恰好构成G的一棵最小生成树。
在上述Prim算法中,还应当考虑如何有效地找出满足条件i∈S, j∈V-S,且权c[i][j]最小的边(i,j)。
实现这个目的的较简单的办法是设置2个数组closest和lowcost。
在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改。
Kruskal算法O(eloge)首先将G的n个顶点看成n个孤立的连通分支。
将所有的边按权从小到大排序。
然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。
这个过程一直进行到只剩下一个连通分支时为止。
一个最值问题的三种解法
一个最值问题的三种解法最优解是某一特定方法能够在有限的资源内获得最佳结果。
一个最优解问题,通常需要求解给定条件下,最大或最小化某种函数。
一个最优解问题的解法有多种,本文将介绍三种常用的方法,分别是动态规划、贪心算法和遗传算法。
一、动态规划动态规划是一种最优化解决方案,它利用拆解子问题的技术,来计算一个复杂问题的最终结果。
它的特点在于将原问题拆解成若干规模更小的连续子问题,然后逐一解决,从而求出最终的最优解。
它的优点是可以把复杂问题分解成若干简单问题,易于理解和求解,每一步只需要解决一个子问题,每一步完成后都能获得此步最优解。
二、贪心算法贪心算法是搜索策略的一种,它旨在从当前状态出发,找出最优解。
贪心算法的基本思想是在每一步中找到当前最佳(最优)解,从而获得最终的全局最优解。
贪心算法比动态规划更加简单,可以用更少的计算量获得最优解,只需要在每一步求解中做出最佳选择,最终就能得到一个最优解。
但是,贪心算法并不一定能得到最优解,需要合适的算法设计和技巧。
三、遗传算法遗传算法是一种基于自然选择原理的模拟算法,它可以用来求解最优化问题。
遗传算法以自然界中的基因进化为基础,它可以作为一种基于总体的搜索算法,来求解复杂的全局最优解。
遗传算法的优点在于可以快速简易的搜索全局最优解,即使在搜索空间中的解很少或巨大时依然可以快速准确的搜索出最优解。
综上所述,最优解问题可以采用动态规划、贪心算法和遗传算法等三种方法解决。
每种方法都有其优点和缺点,应根据实际情况选择最合适的解决方案。
同时,任何一种方法都要结合个人特点和经验,以此提高解决问题的效率。
借助这三种方法,找出一个最优解是可能的,但也要根据实际情况,根据问题的特点和资源限制,挑选最合适的方法,按照一定的算法步骤,结合个人的实际情况和经验,最终得以获得最优解。
计算机基础知识了解计算机算法的动态规划和贪心算法
计算机基础知识了解计算机算法的动态规划和贪心算法计算机基础知识:了解计算机算法的动态规划和贪心算法计算机算法是指在计算机科学中为解决问题而设计的一系列计算步骤。
它是实现特定功能的工具,在计算机科学和软件工程中扮演着重要的角色。
动态规划和贪心算法是计算机算法中常见的两种策略。
本文将详细介绍这两种算法的原理和应用。
一、动态规划算法动态规划算法(Dynamic Programming),又称动态优化算法,是一种将复杂问题分解为更简单子问题的方法,并使用子问题的解来构建原问题的解。
它通常适用于具有重叠子问题和最优子结构性质的问题。
动态规划算法的基本步骤如下:1. 定义问题的状态:将原问题划分为若干个子问题,找出子问题与原问题之间的关系;2. 构造状态转移方程:通过递推或迭代的方式,计算出子问题的解;3. 解决问题:根据状态转移方程,从子问题的解中推导出原问题的最优解;4. 构建解的过程:根据所得的最优解,记录下每一步的决策,以便后续的重建。
动态规划算法的经典应用之一是背包问题。
背包问题是在限定容量的背包中选择合适的物品,使得物品的总价值最大。
通过动态规划算法,我们可以通过计算子问题的解来得到背包问题的最优解。
二、贪心算法贪心算法(Greedy Algorithm)是一种基于贪心策略的算法。
它通过每一步的局部最优选择来达到整体最优解。
贪心算法在每一步的选择中都做出当前最好的选择,而不考虑对后续步骤的影响。
贪心算法的基本思想是:1. 定义问题的解空间和评价标准:确定问题的解空间以及如何评价每个解的好坏;2. 构建解的过程:逐步构建解,每一步都选择当前最优的子解,直到得到最终的解;3. 检查解的有效性:验证得到的解是否符合问题的要求。
贪心算法的经典应用之一是最小生成树问题。
最小生成树问题是在一张无向连通图中选择一棵权值最小的生成树。
贪心算法可以通过每次选择权值最小的边来构建最小生成树。
三、动态规划与贪心算法的比较动态规划算法和贪心算法有相似之处,但也存在一些明显的差异。
动态优化问题常见解法
动态优化问题常见解法动态优化问题是计算机科学中的一个重要领域,它涉及到在给定约束条件下,寻找最优解的问题。
在解决动态优化问题时,常用的几种解法包括贪心法、动态规划法和分治法。
贪心法贪心法是一种简单而常用的动态优化问题解法。
它的基本思想是在每一步都选择当前状态下最优的解,希望通过每一步的最优选择达到全局最优解。
贪心法通常适用于一些较为简单、局部最优即能得到全局最优的情况。
然而,贪心法并不适用于所有动态优化问题,特别是那些需要考虑长远后果的问题。
在使用贪心法解决问题时,需要仔细分析问题的特性以确定贪心策略的适用性。
动态规划法动态规划法是一种比较常用且灵活的动态优化问题解法。
它通过建立一个状态转移方程来逐步求解问题。
具体而言,动态规划法将原问题分解为子问题,然后利用已解决的子问题的解来求解更大规模的问题。
动态规划法通常需要建立一个动态规划表格或数组来存储子问题的解,以便在求解大问题时可以利用已经求解过的子问题的解。
动态规划法的关键在于确定子问题的解以及状态转移方程的定义。
分治法分治法是一种将问题分割为更小的子问题并分别解决的解法。
它的基本思想是将原问题划分为多个相互独立且结构相似的子问题,然后递归地解决这些子问题。
最后,将子问题的解合并得到原问题的解。
分治法通常适用于一些较为复杂的问题,能够有效地解决大规模问题。
然而,分治法并不是适用于所有动态优化问题,具体问题需要根据其特性来确定是否适用分治法进行求解。
总结在解决动态优化问题时,贪心法、动态规划法和分治法是常见的解法。
贪心法适用于一些较为简单且局部最优即为全局最优的问题。
动态规划法通过求解子问题来逐步求解大问题,适用于各类动态优化问题。
分治法通过将问题划分为子问题并递归求解,适用于复杂的大规模问题。
在选择合适的解法时,需要充分考虑问题的特性和约束条件。
每种解法都有其优缺点,在实际应用中需要仔细分析问题的性质以确定最合适的解法。
贪心算法
6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4
种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。
每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。
算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。
动态规划和贪心算法的区别和优劣分析
动态规划和贪心算法的区别和优劣分析动态规划和贪心算法是两种常见的算法设计思想,它们在解决优化问题时起到重要的作用。
本文将从动态规划和贪心算法的定义、特点、区别以及优劣等方面进行分析。
一、动态规划的定义和特点动态规划是一种通过将问题分解为相对简单的子问题来解决复杂问题的方法。
它将问题划分为多个阶段,并找到每个阶段的最优解,最终得到全局最优解。
动态规划的核心是“记忆化搜索”,即将子问题的解存储起来,以避免重复计算。
动态规划的特点有以下几点:1. 具有最优子结构:问题的最优解可以通过子问题的最优解来构造。
2. 重叠子问题:不同的子问题之间存在重叠,可以通过存储子问题的解来避免重复计算。
3. 无后效性:在确定某个阶段的状态后,只需要考虑前面阶段的状态,而不需要关心未来的决策。
二、贪心算法的定义和特点贪心算法是一种每次在当前状态下做出局部最优选择,以期望最后得到全局最优解的算法。
贪心算法不像动态规划一样求解最优解,而是通过每一步的贪心选择来达到近似最优解。
贪心算法的特点有以下几点:1. 贪心选择性质:通过每一步的贪心选择来达到全局最优。
2. 无后效性:当前的选择不会影响未来的选择。
3. 不能回退:一旦做出选择就无法撤销。
三、动态规划和贪心算法的区别动态规划和贪心算法在解决问题过程中存在着明显的区别:1. 最优子结构的要求:动态规划需要满足最优子结构,即全局最优解可以由子问题的最优解构造而成,而贪心算法通常不需要满足最优子结构。
2. 解空间的要求:动态规划可以求解问题的所有解,而贪心算法只能求解问题的某个近似最优解。
3. 处理思路的不同:动态规划通过递推和记录子问题的解来求解最优解,而贪心算法通过每一步的贪心选择来逼近最优解。
四、动态规划和贪心算法的优劣比较动态规划和贪心算法都有各自的优势和劣势,适用于不同类型的问题。
1. 动态规划的优势:- 可以解决更复杂的问题,涉及到多个决策阶段和多个因素的影响。
- 可以求解问题的所有解,给出最优解的具体方案。
贪心算法和动态规划算法
贪⼼算法和动态规划算法动态规划和贪⼼算法都是⼀种递推算法即均由局部最优解来推导全局最优解(不从整体最优解出发来考虑,总是做出在当前看来最好的选择。
)不同点:贪⼼算法与动态规划的区别:贪⼼算法中,作出的每步贪⼼决策都⽆法改变,由上⼀步的最优解推导下⼀步的最优解,所以上⼀部之前的最优解则不作保留。
能使⽤贪⼼法求解的条件:是否能找出⼀个贪⼼标准。
我们看⼀个找币的例⼦,如果⼀个货币系统有三种币值,⾯值分别为⼀⾓、五分和⼀分,求最⼩找币数时,可以⽤贪⼼法求解;如果将这三种币值改为⼀⾓⼀分、五分和⼀分,就不能使⽤贪⼼法求解。
例:贪⼼法标准的选择设有n个正整数,将它们连接成⼀排,组成⼀个最⼤的多位整数。
例如:n=3时,3个整数13,312,343,连成的最⼤整数为34331213。
⼜如:n=4时,4个整数7,13,4,246,连成的最⼤整数为7424613。
输⼊:n个数输出:连成的多位数算法分析:此题很容易想到使⽤贪⼼法,在考试时有很多同学把整数按从⼤到⼩的顺序连接起来,测试题⽬的例⼦也都符合,但最后测试的结果却不全对。
按这种标准,我们很容易找到反例:12,121应该组成12121⽽⾮12112,那么是不是相互包含的时候就从⼩到⼤呢?也不⼀定,如12,123就是 12312⽽⾮12123,这种情况就有很多种了。
是不是此题不能⽤贪⼼法呢?其实此题可以⽤贪⼼法来求解,只是刚才的标准不对,正确的标准是:先把整数转换成字符串,然后在⽐较a+b和b+a,如果a+b>=b+a,就把a排在b的前⾯,反之则把a排在b的后⾯。
动态规划算法与贪⼼法的区别:不是由上⼀步的最优解直接推导下⼀步的最优解,所以需要记录上⼀步的所有解(下例中的F[i][j]就表⽰第i⾏的j个解)能使⽤动态规划算法的条件:如果⼀个问题被划分各个阶段之后,阶段I中的状态只能由阶段I-1中的状态通过状态转移⽅程得来,与其它状态没有关系,特别是与未发⽣的状态没有关系,那么这个问题就是“⽆后效性”的,可以⽤动态规划算法求解动态规划算法求解:1。
大学计算机数学的算法设计与分析
大学计算机数学的算法设计与分析在现代社会中,计算机技术的发展日新月异,成为了人们生活中不可或缺的一部分。
而计算机数学作为计算机科学的基础,对于计算机技术的发展和应用起着至关重要的作用。
算法作为计算机数学的一个重要组成部分,它的设计与分析对计算机的性能和效率起着决定性的影响。
本文将围绕大学计算机数学的算法设计与分析展开讨论。
第一部分:算法设计算法设计是指根据问题需求和计算机的特点,设计出能够解决问题的一系列有序可行的操作步骤。
一个好的算法设计可以提高程序运行的效率和稳定性。
以下是一些常见算法设计的方法:1. 贪心算法:贪心算法是一种以局部最优解为基础,逐步得到全局最优解的策略。
它的设计思想是在每一步都做出当时看起来最优的选择,从而希望最终能够达到全局最优解。
该算法的一个典型应用是霍夫曼编码。
2. 分治算法:分治算法将一个大问题划分为若干个规模较小的子问题,然后分别解决这些子问题,最后将子问题的解合并为原问题的解。
经典的分治算法有快速排序和归并排序。
3. 动态规划算法:动态规划算法常用于求解最优解的问题。
它将原问题划分为若干个子问题,并保存子问题的解,通过递归或迭代的方式求解出最优解。
动态规划算法的一个著名应用是背包问题。
第二部分:算法分析算法分析是指对算法的性能进行评估和分析,主要包括时间复杂度和空间复杂度。
了解算法的时间和空间耗费情况,可以选择更加高效的算法,提高程序的性能。
以下是一些常见的算法分析方法:1. 时间复杂度:时间复杂度是指算法所需要的计算时间和问题规模之间的关系。
常见的时间复杂度有常数阶O(1)、对数阶O(logn)、线性阶O(n)、平方阶O(n^2)等。
通过时间复杂度的分析,可以评估算法的执行效率。
2. 空间复杂度:空间复杂度是指算法在运行过程中所需的内存空间和问题规模之间的关系。
常见的空间复杂度有常数阶O(1)、线性阶O(n)、对数阶O(logn)等。
通过空间复杂度的分析,可以评估算法的内存占用情况。
动态规划和贪心算法的区别和优劣比较
动态规划和贪心算法的区别和优劣比较动态规划和贪心算法是两种经典的问题求解方法,本文将从定义、区别、优劣比较等方面来详细介绍这两种算法。
一、定义1.动态规划动态规划是一种将复杂问题分解成小问题来解决的算法。
将复杂的问题转化为一系列小问题,然后逐步解决每个小问题,最后将这些小问题的解合成总问题的解。
动态规划一般用于求解最优化问题,如求最长公共子序列、最长递增子序列以及最短路径等。
2.贪心算法贪心算法是一种贪心思想来解决问题的算法。
贪心算法的基本思想是,每步中都采取当前状态下最优的选择,希望从局部最优解的选择中得到全局最优解。
二、区别虽然两种算法的思想都是分解问题,但是两者在实现、时间复杂度等方面有着显著的区别,具体如下:1.实现动态规划算法一般需要用到递归或者记忆化搜索等技巧,其中递归算法通常需要很多空间存储中间结果,因此空间复杂度较高。
而贪心算法通常只需要一次遍历即可求解,因此实现较为简单。
2.时间复杂度动态规划算法的时间复杂度一般较高,通常是指数量级。
而贪心算法的时间复杂度较低,通常是常数级别,因此时间效率较高。
3.解决问题的特点动态规划算法通常解决目标函数具有最优子结构性质的问题,即当前状态下的最优解包含以前状态下的最优解。
而贪心算法通常解决目标函数具有贪心性质的问题,如局部最优解能够推导出全局最优解等。
三、优劣比较动态规划算法和贪心算法在不同情况下具有不同的优劣性,如下所示:1.动态规划的优劣a.优点(1).解决所有具有最优子结构的问题。
(2).可以在时间复杂度为多项式级别,空间复杂度为常数级别的情况下求解问题。
(3).可以考虑状态转移方程中的所有状态,找到最优解。
b.缺点(1).实现比较困难,需要使用递归和记忆化搜索等技巧。
(2).需要很多空间存储中间状态。
(3).如果没有最优子结构,导致算法无法求解。
2.贪心算法的优劣a.优点(1).实现简单,易于理解。
(2).时间复杂度低,适合对实时性要求较高的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划算法和贪心算法的比较与分析1、最优化原理根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。
解决这类问题的最优化原理:一个过程的最优决策具有这样的性质,即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略。
简而言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。
2、动态规划2.1 动态规划算法动态规划是运筹学的一个分支,与其说它是一种算法,不如说它是一种思维方法更贴切。
因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。
许多隐式图上的算法,例如求单源最短路径的Dijkstra算法、广度优先搜索算法,都渗透着动态规划的思想。
还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。
因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用。
它必须对具体问题进行具体分析、处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。
动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
值得注意的是,用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。
最优化原理是动态规划的基础。
任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。
能采用动态规划求解的问题都要满足两个条件:①问题中的状态必须满足最优化原理;②问题中的状态必须满足无后效性。
所谓无后效性是指下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结。
2.2 动态规划算法的基本要素(1)最优子结构。
设计动态规划算法的第一步通常是刻画最优解的结构。
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。
在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。
(2)重叠子问题。
在用递归方法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
动态规划算法正是利用了这种子问题的重叠性质,对每个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时只是简单地用常数时间查看一下结果。
2.3 动态规划适于解决的问题适用动态规划的问题必须满足最优化原理和无后效性。
(1)状态必须满足最优化原理。
作为整个过程的最优策略具有如下性质:无论过去的状态和决策如何,对前面的决策所形成的当前状态而言,余下的诸决策必须构成最优策略。
可以通俗地理解为子问题的局部最优将导致整个问题的全局最优,即问题具有最优子结构的性质,也就是说一个问题的最优解只取决于其子问题的最优解,非最优解对问题的求解没有影响。
(2)状态必须满足无后效性。
所谓无后效性是指:“过去的决策只能通过当前状态影响未来的发展,当前的状态是对以往决策的总结”。
它说明动态规划适于解决当前决策和过去状态无关的问题。
状态出现在策略的任何一个位置,它的地位都是相同的,都可以实施同样的决策,这就是无后效性的内涵。
2.4 问题求解模式动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。
这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。
如下所示: 初始状态→决策1 →决策2 →决策n →结束状态动态规划的设计有一定的模式,一般要经历以下4个步骤:(1)划分阶段。
按照问题的时间或空间特征,把问题分为若干个阶段。
在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量。
将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。
当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程。
因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。
所以如果确定了决策,状态转移方程也就可写出。
但事实上常常是反过来做,根据相邻两段各状态之间的关系来确定决策。
(4)寻找边界条件。
给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
用动态规划算法解决一个问题关键就是确定以上4个步骤。
3、贪心算法3.1贪心算法的定义贪心算法是一种改进的分级处理方法。
用贪心法设计算法的特点是一步一步地进行,根据某个优化测度,每一步都要保证能获得局部最优解。
每步只考虑一个数据,它的选取应满足局部优化条件。
若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或不能再添加为止。
这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。
选择能产生问题最优解的最优度量标准是使用贪心法的核心问题。
贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。
贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该问题运用贪心策略可以得到最优解或较优解。
(注:贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解。
但其解必然是最优解的很好近似解。
)采用自顶向下的、以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。
通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。
然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
3.2 贪心算法的基本要素贪心算法通过一系列的选择得到问题的解。
它所做出的每一选择都是当前状态下局部最好选择,即贪心选择。
可以用贪心算法求解的问题一般具有两个重要性质:(1)贪心选择性质。
所谓贪心选择性质是指所求问题的整体最优解能通过一系列局部最优的选择(即贪心选择)来达到。
(2)最优子结构性质。
与动态规划算法相同,最优子结构性质是一个问题可用贪心算法求解的关键特征。
3.3 贪心算法的实际应用(1)贪心法的基本思路。
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快地求得更好的解。
当达到某算法中的某一步不能再继续前进时,算法停止。
(2)该算法存在的问题。
1)不能保证求得的最后解是最佳的;2)不能用来求最大或最小解问题;3)只能求满足某些约束条件的可行解的范围。
(3)实现该算法的过程。
1)从问题的某一初始解出发;2)当能朝给定总目标前进一步时,求出可行解的一个解元素;3)由所有解元素组合成问题的一个可行解。
4、动态规划算法与贪心算法4.1联系都是通过局部最优解得到整体最优解。
4.2 区别贪心算法是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法,贪心策略总是做出在当前看来最优的选择,并不是从总体上加以考虑,它所做的选择只是在某种意义上的局部最优解。
它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,最终可得到问题的一个最优解。
动态规划是在每一步判断的时候只须考虑与它有关的前一步的情况而与以前的各步的判断没有关系,解决这类问题的方法是:把问题化成多步判断的问题,在每步作出判断时,只考虑由初始决策所确定的当前状态。
它采用自底向上的顺序,找到边界条件,将整个问题的最优解与问题的局部最优解用递推的等式联系起来,把边界条件代入递推等式逐步求得最优解。
动态规划算法与贪心算法都要求问题具有最优子结构性质,这是二者的一个共同点。
但是对于具有最优子结构的问题应该选择前者还后者来解决?下面通过两个经典的组合优化问题谈谈动态规划算法与贪心算法的主要差异。
4.3 0-1背包问题与背包问题0-1背包问题:给定n种物品和一个背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择:即装入背包或不装入背包。
不能将物品i放入背包多次,也不能只装入部分的物品i。
背包问题:与0- 1背包问题类似,不同的是在选择物品i装入背包时,可选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
4.4 动态规划算法与贪心算法的主要差异0-1背包问题和背包问题这两类问题都具有最优子结构性质。
虽然它们极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。
用贪心算法解背包问题的基本步骤是,首先计算每种物品单位重量的价值vi/wi,然后依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。
若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。
依此策略一直进行下去直到背包装满为止。
这种贪心选择策略对0-1背包问题就不适用了。
如图1(a)所示,其中有3种物品,背包的容量为50公斤。
物品1重10公斤,价值60元;物品2重20公斤,价值100元;物品3重30公斤,价值120元。
因此,物品1每公斤价值6元,物品2每公斤价值5元,物品3每公斤价值4元。
若依贪心选择策略,应首选物品1装入背包,然而从图1(b)的各种情况可看出,最优的选择方案是选择物品2和物品3装入背包。
首选物品1的2种方案都不是最优的。
对于背包问题,贪心选择最终可得到最优解,其选择方案如图1(c)所示。
对于0- 1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的空间使每公斤背包空间的价值降低。
在考虑0- 1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再做出最好的选择。
由此就导出许多互相重叠的子问题。
这正是该问题可用动态规划算法求解的另一重要特征。
(a) (b) (c)图1两种算法解决背包问题5、结束语在动态规划算法中,每步所做出的选择往往依赖于相关子问题的解。
因而只有在解出相关子问题后,才能做出选择。
而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应的子问题。
贪心算法所做出的贪心选择可以依赖于以往所做过的选择,但决不依赖于将来所做的选择,也不依赖于子问题的解。
正是由于这种差别,动态规划算法常以自底向上的方式解各子问题,而贪心算法则常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做出一次贪心选择就将所求问题简化为规模更小的子问题。