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

你可能感兴趣的:(week 16)