贪心算法是一种在每一步选择中都采用在当前状态下最好或最优(即最有利)的选择, 从而希望导致结果是全局最好或者 最优的算法.(用贪心算法,尤其是最基础的贪心,每次当下情况下找到最优不一定能够达到全局最优的情况) 贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退.动态规划会保存以前的运算结果, 并根据以前的结果对当前进行选择, 有回退功能.
贪心: 当下做局部最优判断 回溯: 能够回退 动态规划: 最优判断 + 回退 (带最优判断的回溯,我们叫做动态规划,动态规划会保存以前的运算结果, 并根据以前保存的结果, 对当前进行选择有回退功能)
贪心法可以解决一些最优化问题, 如: 求图中的最小生成树,求哈夫曼编码等. 然而对于工程和生活中的问题, 贪心法一般不能得到我们想要的答案, 一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法.由于贪心法的高效性以及其所求得的答案比较接近最优结果, 贪心法也可以用作辅助算法,或者解决一些要求结果不特别精确的问题
322 零钱兑换
/* 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你可以认为每种硬币的数量是无限的。 */当硬币可选集合固定: Coins = [20, 10, 5, 1] 求最少可以几个硬币拼出总数, 比如total = 36 首先用20先去匹配, 20最多可以匹配多少个,我们就把20能匹配的个数全部都用总数减去,现在总数为36,所以总数为1个,也就是36除以20,整除除得多少表示20可以用多少个,这里只有一个,那么得到16, 再看10, 在看5, 在看1, 所以这里贪心法是先用最大的去匹配, 再用次大的再匹配 为什么可以用贪心法,是因为硬币的话20 10 5 1前面的硬币依次是后面这些硬币的倍数, 所以如果你需要用两个10,或者4个5的话,肯定还不如用一个20,因为后面都是整除前面最大的硬币,贪心法每次用最大的即可, 既然用20,那么肯定后面这些会不优于直接选20的情况, 贪心法有它的特殊性, 这个硬币有整除的关系,所以用贪心法, 但在大部分情况下
简单地说, 问题能够分解成子问题来解决, 子问题的最优解能递推到最终问题的最优解,这种子问题最优解称为最优子结构. 贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退.动态规划则会保存以前的运算结果, 并根据以前结果对当前进行选择, 有回退功能
在现实生活中很少用到贪心, 你要是每天只满足自己当下的需求, 你觉得游戏好就打游戏,或者饿了饱吃一顿, 每天都吃很多类似于这样的东西, 最后发现长期是达不到最优解的,比如时间都浪费在一些可能提高自己的短期比较痛苦但长期的话,对你有益的事情上面,以及要自律,保持体重,或者是要去健身这些, 这些都是短期让你痛苦,长期让你受益的行为