week 16

动态规划和背包问题理解

背包问题的理解

背包问题:物品有两个属性:重量和价值,即一个是增益,一个是获取限制,求利益最大化
贪婪算法:
1、优先选择价值高
2、优先选择重量低
3、优先选择 价值/重量

最优解:
盗贼背包问题被称为0/1背包问题
贪婪算法近似解复杂度 O(nlog(n))
暴力最优解复杂度O(n**n)

动态规划问题的理解

适用于解决具有重复子问题和最优子结构的问题
递归斐波那契效率问题
复杂度O(fib(n))

动态规划问题的核心:保存调用结果,需要的时候查找,成为备忘录法
备忘录法斐波那契数列:

def fastFib(n, memo = {}):
"""假设n是非负整数, memo只进行递归调用 返回第n个斐波那契数"""
if n == 0 or n == 1:
return 1
try:
return memo[n]
except KeyError:
result = fastFib(n-1, memo) + fastFib(n-2, memo)
memo[n] = result
return result

动态规划和分治算法的理解
动态规划和分治算法的共同点:先解决独立的子问题,再将子问题的解合起来。
动态规划和分治算法的不同点:
1、分治算法子问题的规模远小于动态规划
2、分治算法的效率并不取决于算法结构,所以同样的问题会被重复解决
3、不同子问题的数量远远小于所有子问题的数量时,动态规划才是有效率的。

分治法是指将问题划分成一些独立地子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题独立且重叠的情况,也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。

适合采用动态规划方法的最优化问题中的两个要素:最优子结构和重叠子问题
参考:
https://blog.csdn.net/u010002184/article/details/77046277

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 安利一本书,《幸福的婚姻》。 第一次知道这书作者约翰.戈特曼,是李先生参加一个情商培训,培训内容里就有戈特曼的研究...
    岳岳爱吃蔬菜阅读 1,586评论 8 3
  • question 1 给定两个字符串,判断小的那个字符串的内容能不能从大的字符串里面得到(题目是说从杂志里找单词来...
    vincehxb阅读 1,196评论 0 0
  • 上课视频: 链接:https://pan.baidu.com/s/11Pz2yzEUXKyQyufibv9LKQ ...
    joy_蓝蜘蛛阅读 4,636评论 1 4
  • 二月二龙抬头,一年鸿运好兆头!今天是农历二月初二,这一天,人们会理发,图鸿运当头。还将美食加上“龙”以示吉庆:吃...
    牛奶咕啾阅读 819评论 0 0
  • 偶然阅读了一篇韩寒的文章《春萍,我做到了》,很意外,在出社会几年的时光里能够一起品味一些文章,领悟其中之哲...
    四月1988阅读 3,401评论 1 0