对动态规划和贪心算法的一点理解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 一直很模糊的感觉这两个重要的算法应该有些联系。首先都是求解最优问题的很有效的方法,其次都有明显的最优判定:通过对某些值的MAX和MIN 运算来决定下一步的步骤。具体的异同自己就说不清楚了,关键是对动态规划算法本身也不是特别理解。今天看了一下MIT的算法导论的相关章节,算是有了个大 概认识。
(题外话:算法导论看得不多,但只就这两章而言,可以看出这本教材和国内的算法教材大不一样。国内的教材很多都直接的“由易而难”先介绍贪心然 后介绍动态规划,感觉似乎有很重的“竞赛”气息。而算法导论是先介绍动态规划,再介绍贪心,从学术的角度考虑,动态规划是基础而贪心是特例,这么说来,似 乎国内的教材过于功利化,而缺少纯理论上的培养价值。)
求最优解的问题,从根本上说是一种对解空间的遍历。最直接的暴力分析容易得到,最优解的解空间通常都是以指数阶增长,因此暴力穷举都是不可行的。
最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,如上面的分析,这是不可行的。
贪心和动态规划本质上是对子问题树的一种修剪。两种算法要求问题都具有的一个性质就是“子问题最优性”。即,组成最优解的每一个子问题的解,对 于这个子问题本身肯定也是最优的。如果以自顶向下的方向看问题树(原问题作根),则,我们每次只需要向下遍历代表最优解的子树就可以保证会得到整体的最优 解。形象一点说,可以简单的用一个值(最优值)代表整个子树,而不用去求出这个子树所可能代表的所有值。
动态规划方法代表了这一类问题的一般解法。我们自底向上(从叶子向根)构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中 的最优值作为自身的值,其它的值舍弃。动态规划的代价就取决于可选择的数目(树的叉数)和子问题的的数目(树的节点数,或者是树的高度?)。
贪心算法是动态规划方法的一个特例。贪心特在,可以证明,每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需 要知道一个节点所有子树的情况,就可以求出这个节点的值。通常这个值都是对于当前的问题情况下,显而易见的“最优”情况。因此用“贪心”来描述这个算法的 本质。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。这样,与动态规划相比,它的代 价只取决于子问题的数目,而选择数目总为1。

背包问题

以背包问题为例。贪心算法的思路是,直接选择当前价格/重量比最大的物品放入背包,力图保持背包内的物品的总的价格/重量比总是最大的,以得到 最优的值。动态规划的思路是,对于每一种物品,都要考虑“放它”和“不放它”两种情况,并取最优的一种作为解。动态规划对解空间的遍历要比贪心完全。
显然,如果能保证背包总是满的,则贪心算法是正确的。但0-1背包问题不能保证背包总是满的,这样就降低了整体背包的价格/重量比。这种情况,就只能用动态规划来解。
感觉背包问题似乎是个特例,问题当前的状况(剩余的物品)就可以决定当前的选择,但其它的限制(背包的总重量)使得贪心是错误的。
 
其余的问题,如矩阵连乘,子串匹配等,则显然不具备贪心的要求,只能用动态规划来解。

另一个问题:背包问题是NP完全问题吗

推荐一个网站: http://www.answers.com,集合了非常棒的定义、资料,下面的文字出自这个网站。
背包问题的动态规划解法是一个“伪多项式阶”算法。如果总重量的整数值c作为规模,它是多项式阶的(O(nc))。而如果用c的二进制位数作为 规模,则它是指数阶的。因此,最优形式解形式(optimization)的背包问题仍是一个NP完全问题,但它有伪多项式阶的解。
关于“伪多项式阶”,有一个形象的例子:求整数n的因数。显然至多只要从2~n-1挨个除一遍就可以得到所有的因数,似乎这是O(n)阶的,但其实若从n的位数来考虑,它就成为了指数阶而变得不可求解。这恰巧就是现在网络加密算法的基础。
而背包问题的判定形式(decision)则是真正的NP完全问题:
对于一组物品,给定价值和重量,在满足重量限制的前提下,能否选出物品的一组子集,使得总价值恰好等于某一个给定值C。
这又被称为“子集和(subset sum)”问题。
 
参考链接: http://www.answers.com/topic/knapsack-problem,以防我理解有误。
贪心算法动态规划的个人理解 最近通过各个公司的笔试题发现,好多编程题都是贪心算法动态规划算法。这两个也容易混淆,在网上也看了好多这两种算法的解析,通过这篇文章写下自己对这两种算法理解。 使用动态规划的最大特性是原问题的最优解必须包含子问题的最优解。下面通过一个例子解释:求图的最短路径是解释动态规划最容易的问题。下面是一个多段图: 按照贪心算法的思路解决问题可以得到:v1到v2:1到2最短,所以选择2,总长s为2。... 阅读详情

相关推荐

贪心算法 vs 动态规划:5个经典案例带你理解差异

我们的目的是让大家清晰地理解贪心算法动态规划这两种算法的区别。为了达到这个目的,我们会用5个经典案例来进行详细说明,从基础概念到实际应用,全面覆盖这两种算法的相关知识。本文首先会介绍一些必要的术语,接着引入核心概念,通过故事比喻让大家轻松理解贪心算法动态规划。然后用Python代码详细讲解算法原理操作步骤,还会给出数学模型公式。之后通过5个经典案例进行项目实战,包括开发环境搭建、源代码实现解读。再探讨它们的实际应用场景、推荐相关工具资源,分析未来发展趋势与挑战。

AI 算法实战派 994

贪心算法动态规划

有关动态规划贪心的算法,新手可以看看!我是新手!

动态规划/贪心算法问题】零钱兑换问题

零钱兑换问题是一个经典的动态规划问题,旨在计算用最少的硬币数量来凑成指定金额。该问题可以通过动态规划贪心算法来解决,但在某些情况下,贪心算法并不适用。贪心算法适用于某些特定的硬币面额组合,但并不适用于所有情况。贪心策略是每次选择面额最大的硬币,直到凑成目标金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。通过对零钱兑换问题的深入分析实现,学习者可以掌握动态规划贪心算法的应用,提升解决实际问题的能力。,表示不同面额的硬币,以及一个整数。

Oo1101oO的博客 1378

贪心算法动态规划的区别

贪心算法动态规划的一个特例,动态规划贪心算法的泛化。 动态规划类似于穷举法,只是记录了之前的结果,不需要进行重复的计算,可以利用前边的结果(状态方程),一般复杂度比贪心高,但是可以得到全局最优解。 贪心算法每次只考虑当前,不保证能得到全局最优,只保证当前最优,应用前一般需要证明,一般复杂度比较低。 ...

TABE_的博客 3835

动态规划贪心算法

动态规划问题的第二个性质是子问题空间必须足够“小”,也就是说,问题的递归算法会求解相同的子问题,而不是一直生成新的子问题(分治法求解的问题在每一步递归都生成全新的子问题),由于子问题的求解依赖于更小的子问题的求解,我们将子问题的规模按大小排序,按由小至大的顺序进行求解,这样在求解某一个子问题时会依赖于上一个求解的子问题。两个问题都用到了子问题,而最长简单子路径的子问题是相关的,而最短路径的子问题是无关的,这里无关是指:同一个原问题的一个子问题不影响另一个子问题的解。

dzy521的博客 1万+

算法学习篇11——动态规划贪心算法

动态规划贪心算法是解决优化问题的两种重要算法范式。本文将介绍这两种算法的基本概念、特点、适用场景,并通过Go语言实现的示例代码来展示它们的应用。

a19884792066的博客 464

贪心算法的原理以及应用

贪心算法自上而下,是动态规划的一个特列。

记录一些平时工作或者学习中的瞬间 3076

贪心算法动态规划算法

动态规划贪心算法都是一种递推算法,均由局部最优解来推导全局最优解 。 贪心算法 不断贪心地选取当前最优策略的算法设计方法。 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。 动态规划算法 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 2.动态规划的关键是状态转移方程,即如何由以求出的

wuyuxiu123的博客 2179

动态规划贪心算法的区别

动态规划动态规划应用于子问题重合的情况,不同的子问题具有相同的子子问题, 动态规划算法将每个子问题求解一次,将其解保存在一个表格中,需要时进行调用。 刻画一个最优解的结构特征。 递归的定义最优解的值。 计算最优解的值,有自顶向下自底向上的方法,通常采用自底向上的方法。 一、DP思想: 1、把一个大的问题分解成一个一个的子问题。 2、如果得到了这些子问题的解,然后经过一定的处理,就可...

youhuakongzhi的博客 8316

贪心算法动态规划

贪心算法动态规划是两种非常强大的算法设计策略,它们在许多复杂问题中都展现出了出色的性能。在计算机科学中,它们被广泛应用于解决优化问题,如资源分配、路径寻找等。在这篇博客中,我们将通过具体的Java案例来探讨这两种算法的设计应用,并详细比较它们的区别。贪心算法是一种通过每一步的最优选择,希望得到全局最优解的算法。它通常基于当前状态局部信息做出决策,而没有对问题进行全面的扫描分解。

double222222的博客 1860

算法篇——贪心算法动态规划

写在前面: 动态规划贪心算法这几天真的是让我很费神。今天,就拎出来好好在这说一说。 举例:给你一根长度为n的绳子,请把绳子剪成m段,请问最终每段绳子长度的乘积是多少?例如,当绳子的长度为8时,我们剪成3,3,2三段,最大乘积是18。 接下来,我们分别用这两种方法求解。 动态规划 可以应用动态规划求解的问题的特点: 1.求一个问题的最优解; (求绳子的乘积最大值。) 2.整体问题的最优解依赖各个子...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 1万+

贪心算法开始认识动态规划——硬币找零问题

贪心算法初识动态规划什么是动态规划硬币找零问题问题描述示例题目分析贪心算法贪心算法的基本思路回到硬币找零问题贪心算法的局限性总结与升华 什么是动态规划 动态规划是一种通过“大而化小”的思路解决问题的算法。区别于一些固定形式的算法,如二分法,宽度优先搜索法,动态规划没有实际的步骤来规定第一步做什么第二步做什么。 所以更加确切的说,动态规划是一种解决问题的思想。这种思想的本质是,将一个规模比较大的问题,通过规模比较小的若干问题的结果来得到的。 从另一方面来说,计算机是很笨的,我们最开始都是通过穷举法来解决问题

zbp_12138的博客 8890

动态规划贪心算法

算法思想 动态规划(Dynamic programming,简称DP);核心思想是把原问题分解成子问题进行求解,也就是分治的思想。 那么什么问题适合用动态规划呢?我们通过一个现实中的例子,来理解这个问题。大家可能在公司里面都有一定的组织架构,可能有高级经理、经理、总监、组长然后才是小开发,今天我们通过这个例子,来讲讲什么问题适合使用动态规划。又到了一年一度的考核季,公司要挑选出三个最优秀的员工。一...

weixin_43892514的博客 3590

动态规划贪心算法、分治算法的优缺点分析

动态规划模型相对于静态规划模型的优点: 1. 能够得到全局最优解; 2. 可以得到一族最优解; 3. 由于动态规划方法反映了动态过程演变的联系特征,在计算时可以利用实际知识经验提高求解效率。动态规划模型的缺点: 1. 没有统一的标准模型; 2. 数值方法求解时存在维数灾。(需要额外的内存空间,并且一维问题可能需要二维空间) 《算法之道》对三种算法进行了归纳总结,如下表所示: ...

IMUHERO 3万+

活动安排问题的动态规划贪心算法树搜索算法求解

活动安排问题的动态规划贪心算法树搜索算法求解一、题目描述1、题目2、题目分析二、分析并解决问题三、算法实现1、c语言(1)动态规划(2)贪心算法(3)树搜索算法二级目录二级目录四、后记二级目录三级目录 一、题目描述 1、题目   给定一组活动的开始结束时间,在其中选出最多活动,使它们不互相冲突。 2、题目分析   其实这个问题还是比较容易理解的,就是在一定时间内尽可能让更多的活动 二、分析并解决问题 三、算法实现 1、c语言 (1)动态规划 (2)贪心算法 (3)树搜索算法 二级目录 二级目录 四、后

qq_44753451的博客 5939

Java中贪心算法动态规划算法详解

本文详细介绍了Java中的贪心算法动态规划算法贪心算法通过每一步的局部最优选择寻求全局最优解,适用于活动选择、零钱找零等问题,但要求问题具有贪心选择性质。动态规划则通过分解子问题并存储中间结果来解决更复杂的问题。文章对比了两者的区别,并提供了Java实现示例,包括活动选择、零钱找零等经典问题。这两种算法各具特点,适用于不同类型的优化问题。

2403_88265297的博客 1015
上一篇: 关于STL容器实现,非侵入式容器+Iterator框架和“侵入式”容器实现的思考
下一篇: Eclipse RCP: Declarative Actions
hanbf
博客等级 码龄22年 8粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值