【算法题】动态规划

独自空忆成欢 提交于 2019-11-27 10:55:52

动态规划一般分为三类问题:

  1. 计数
    -有多少种方式走到右下角
    -有多少种方法选出k个数使得和是Sum
  2. 最大最小值
    -从左上角走到右下角路径的最大数字和
    -最长上升子序列长度
  3. 存在性
    -取石子游戏,先手是否必胜
    -能不能选出k个数使得和是Sum

例题:
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.

样例

样例1

输入:
[1, 2, 5]
11
输出: 3
解释: 11 = 5 + 5 + 1

样例2

输入: 
[2]
3
输出: -1

解题步骤如下(以样例1为例):

  1. 确定状态。
    最后一步(最优策略中使用的最后一枚硬币\(a_k\))、化成子问题(最少的硬币拼出更小的面值\(11-a_k\))。
  2. 转移方程。
    \[ dp[X]=min\{ dp[X-2]+1,dp[X-5]+1,dp[X-7+1] \} \]
  3. 初始条件和边界条件。
    $ dp[0] = 0 $,如果不能拼出Y,
    $ dp[Y] = INTMAX $
  4. 计算顺序。
    $ f[0],f[1],f[2]… $
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!