一、概念
通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
二、题型特点
- 计数
- 有多少种方式走到最右下角
- 求最大值最小值
- 从左上角走到右下角的最大数字和
- 求存在性
- 能否选出k个数使得和为sum
三、如何使用动态规划
这里先看一道LeetCode题。从这道题来学习如何使用动态规划。
Coin Change
给定不同面额的硬币 coins 和一个总金额 amount。
编写一个函数来计算可以凑成总金额所需的最少的硬币个数。
如果没有任何一种硬币组合能组成总金额,返回 -1。
示例
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
该题是一个求最大最小的动态规划算法题。
与递归解法相比,没有重复计算。
3.1 组成部分一:确定状态
确定状态需要有两个注意的点:最后一步
、子问题
1.最后一步
肯定是 k k k枚硬币加起来等于11。最后一枚硬币值假设是 a k a_k ak,则剩下的 k − 1 k-1 k−1枚硬币的值为 11 − a k 11-a_k 11−ak。
由于是最优解,则11- a k a_k ak的硬币数一定是最少。
2.子问题
将原问题转换为子问题,最少用多少枚硬币拼出 11 −