动态规划一般分为三类问题:
- 计数
-有多少种方式走到右下角
-有多少种方法选出k个数使得和是Sum - 最大最小值
-从左上角走到右下角路径的最大数字和
-最长上升子序列长度 - 存在性
-取石子游戏,先手是否必胜
-能不能选出k个数使得和是Sum
例题:
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.
样例
样例1
输入: [1, 2, 5] 11 输出: 3 解释: 11 = 5 + 5 + 1
样例2
输入: [2] 3 输出: -1
解题步骤如下(以样例1为例):
- 确定状态。
最后一步(最优策略中使用的最后一枚硬币\(a_k\))、化成子问题(最少的硬币拼出更小的面值\(11-a_k\))。 - 转移方程。
\[ dp[X]=min\{ dp[X-2]+1,dp[X-5]+1,dp[X-7+1] \} \] - 初始条件和边界条件。
$ dp[0] = 0 $,如果不能拼出Y,
$ dp[Y] = INTMAX $ - 计算顺序。
$ f[0],f[1],f[2]… $