【算法题】动态规划

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

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

解题思路一般需要首先bottom-up然后top-down去设计。

例题:
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -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-1]+1,dp[X-2]+1,dp[X-5]+1 \} \]
  3. 初始条件和边界条件。
    $ dp[0] = 0 $,如果不能拼出Y,
    $ dp[Y] = INTMAX $
  4. 计算顺序。 利用好之前的计算结果。
    $ dp[0], dp[1], dp[2]… $

猜你喜欢

转载自www.cnblogs.com/lvjincheng/p/11360574.html
今日推荐