▎敢问此间贪心为什么物?html
☞『引入』算法
在平时咱们在解决一些事情时都会用到贪心的思想,我能够实诚的告诉你,你可能已经会贪心了。spa
好比说,在咱们买东西时,同种物品绝对是买便宜的那一家的货啦,好比说西红柿若是一家卖1元/斤,那么你确定不会买1.2元/斤的。3d
再好比说:你正在打游戏,假如忽然天上掉下了一个箱子,那么给你一个选择,你要一个装着大师剑的箱子,仍是要一个装着一个烂大街的小木棍的箱子,固然,你必定会选择前者。htm
若是你会这样作,那么,恭喜你,你已经学会贪心了。blog
☞『贪心算法』游戏
贪心算法(又称贪婪算法)是指,在对问题求解时,老是作出在当前看来是最好的选择。也就是说,不从总体最优上加以考虑,他所作出的是在某种意义上的局部最优解。(copy自百度)get
说白了就是不管什么状况下都要取当前最优的方法,好比说我要去学校,假如学校在南面,那么我必定会向南走,不然都会绕远。数学
☞『计算机实例』it
如上图所示,这是一个有6个格子的方格阵,要求从每列中取出一个数,使总和最大。
显然,这道题是能够贪心的,只要取每列中的最大的数就能够了。
▎这么简单为何不用?
☞『引入』
如上图所示,这是三块苹果,按大小分为了大块、中块、小块,那么我们来作一个游戏:不限时间,一共三块,每吃完一块后能够接着吃剩下的,那么比比谁吃得多。
按照贪心的思路来讲,绝对拼手速先吃到大块,接下来呢?剩下啥吃啥呗。
可是若是用动态规划的思路的话,我会先吃小块,不管对方吃中块仍是大块,都会赶在他吃完前拿走剩下的第三块(若是这也比不过,你直接认怂就好了),显然,任意两块都会比一块多。
☞『贪心不必定是最优的』
由上面生活中的例子能够看出,贪心每次只选择当前最优的方案,却不在意这个选择对整个大问题是否最优,显然,对于这个问题来讲这是不正确的。
这正是贪心与动态规划的不一样。
☞『一个正常的例子』
仍是以前的图:
可是题变了,如今我要从左下角走到右上角,求走过路径上的最大值。
要求:
1)走过的格子不能再走;
2)只能向上或向右;
贪心算法求解:1 -> 3 -> 4 -> 6 。
动态规划求解:1 -> 2 -> 10 -> 6 。
显然动态规划的解才是最优的,而贪心却不是。
▎怎样才能贪心?
☞『贪心选择』
贪心选择是指所求问题的总体最优解能够经过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法作出相继选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要肯定它是否具备贪心选择的性质,咱们必须证实每一步所做的贪心选择最终能获得问题的最优解。一般能够首先证实问题的一个总体最优解,是从贪心选择开始的,并且做了贪心选择后,原问题简化为一个规模更小的相似子问题。而后,用数学概括法证实,经过每一步贪心选择,最终可获得问题的一个总体最优解。(copy自百度)
一句话归纳这一堆(tuo)话:就是说必须得让每一次的选择都得是当前最优的。
☞『最优子结构』
当一个问题的最优解包含其子问题的最优解时,称此问题具备最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操做都对结果产生直接影响,而动态规划则不是。贪心算法对每一个子问题的解决方案都作出选择,不能回退;动态规划则会根据之前的选择结果对当前进行选择,有回退功能。动态规划主要运用于二维或三维问题,而贪心通常是一维问题 。(copy自百度)
一句话归纳这一堆(tuo)话:就是说这道题必须得保证每一次的当前最优选择对于全局来讲都是最优的。
所以,只有同时知足贪心选择和最优子结构的题才能用到贪心。
原文出处:https://www.cnblogs.com/TFLS-gzr/p/11142693.html