算法设计:动态规划问题

适合采用动态规划(dynamic programming)方法的最优化问题中的两个要素:最优子结构和重叠子问题。

最优子结构:

用动态规划求解最优化问题的第一步就是刻画最优解的结构,如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。因此,某个问题是否适合应用动态规划算法,它是否具有最优子结构性质是一个很好的线索。使用动态规划算法时,用子问题的最优解来构造原问题的最优解。因此必须考查最优解中用到的所有子问题。

重叠子问题:

在斐波拉契数列结构图中,可以看到大量的重叠子问题,比如说在求fib(6)的时候,fib(2)被调用了5次。如果使用递归算法的时候会反复的求解相同的子问题,不停的调用函数,而不是生成新的子问题。如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping subproblems)性质。在动态规划算法中使用数组来保存子问题的解,这样子问题多次求解的时候可以直接查表不用调用函数递归。
步骤:

  1. 动态规划方法的第一个步骤是描述最优解的结构的特征。
  2. 第二个步骤是利用子问题的最优解来递归定义一个最优解的值。
  3. 第三个步骤计算最优解
  4. 第四个步骤构造最优解

一、eg1:dp方法求解硬币找零问题

我们的动态编程解决方案将从找零一分钱开始,并系统地找到我们需要的找零额。这保证我们在算法的每一步,已经知道为任何更小的数量进行找零所需的最小硬币数量。

用一个动态规划算法来解决我们的找零问题。 dpMakeChange 有三个参数:一个有效硬币值的列表,我们要求的找零额,以及一个包含每个值所需最小硬币数量的列表。 当函数完成时,minCoins 将包含从 0 到找零值的所有值的解

def dpMakeChange(coinValueList,change,minCoins):
   for cents in range(change+1):
      coinCount = cents
      for j in [c for c in coinValueList if c <= cents]:
            if minCoins[cents-j] + 1 < coinCount:
               coinCount = minCoins[cents-j]+1
      minCoins[cents] = coinCount
   return minCoins[change]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值