贪心算法与动态规划区别

来源:互联网 发布:在万网买的域名怎么用 编辑:程序博客网 时间:2024/06/02 05:39

动态规划:最优子问题组合成最优的大问题的解

贪心算法:如其字面意思——贪心选择。一个全局最优解可以通过局部最优(贪心)选择来达到,也即考虑做何种选择时,只需要考虑对当前问题最佳的选择而不用考虑子问题的结果,这一点是贪心算法不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解,因此,解动态规划问题一般是自底向上求解的,从小子问题处理至大子问题。而在贪心算法中,我们所做的总是当前看似最佳的选择,然后再解决选择之后所出现的子问题。所以贪心策略通常是自顶向下地做的,一个一个地做出贪心选择,不断地将给定问题实例归约为更小的问题。当然,前提是我们已经证明在每一步所做的贪心选择最终能产生一个全局最优解。


这是比较正式点的解释。其实一句话概括:贪心算法就是每次都最贪心得拿取,管它三七二十一呢,先拿最多的再说,当然事实上早就心知肚明每次拿最多能够让我最终拿到的所有是最优的结果。而动态规划则需要瞻前顾后每次都要保证我当前的子问题一定是一个最优解。

举个取硬币的例子:有1元硬币、3元硬币、5元硬币,如果问题是:给你10秒钟的时间,你以最少数量拿到最大的金额,那你会怎么抢?当然是贪心地先把5元硬币拿完啦,拿完就赶紧拿3块的,最后才拿1元的,这就是贪心的策略,当然我们开始拿之前已经心知肚明我们这样贪心地拿是能够保证我们最终能拿到最大的金额(用教材的说法就是“每次做出贪心选择总是安全的”)。

然而把这个例子换成搬家,行李有大有小,但一辆车只有固定那么大,如果用贪心策略,那就是先把最大件的东西塞下去,最后发现没摆几件别的已经塞不下去了,然而大件行李中间还有一堆的空隙但是却没法放了,最后亏大了,而用我们日常生活经验来说,若想塞得最多,大中小的行李都得塞,把整辆车的空间充分利用好,把缝隙都塞满,连细小的缝隙都不放过,那才能达到最优解。

0 0