动态规划
动态规划
动态规划(Dynamic Programming,DP):将一个复杂的问题分解为若干个子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的解。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区别于贪心算法,贪心算法没有状态推导,而是从局部直接选最优的。
步骤
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- 初始化dp数组
- 确定遍历顺序
- 举例推导dp数组
适用条件
动态规划适用于有重叠子问题和最优子结构性质的问题。
重叠子问题
重叠子问题:在使用分治算法时,相同的子问题会被重复计算多次。
最优子结构
最优子结构:一个问题的最优解包含其子问题的最优解。
0-1背包
问题描述
有N件物品和一个最多能承受重量为W的背包,第i件物品的重量是weight[i],价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包可使价值总和最大?
完全背包
问题描述
有N件物品和一个最多能背重量为W的背包,第i件物品的重量是weight[i],价值是value[i]。每件物品无限个,求解将哪些物品装入背包可使价值总和最大?
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Fms231!