暴力递归到动态规划--组成额定金额的方法数

对于递归,问题在于其实质为暴力展开,所以会导致重复的操作。通过增设傻缓存记录和动态规划可以优化递归,当元素的依赖数是有限的,比如马跳日,机器人步数等,这时记忆化搜索和动态规划是没多大却别的。
但是当有枚举行为时(即不同格子依赖数各不同),就需要动态规划,因为动态规划还具有优化的余地,如下题。

  • 题目

有一定数目不同面额的货币供选择,每个面额选取数不限,求组成总金额为M的方法数。在这里插入图片描述

  • 分析

1)递归逻辑

比如货币面额放在一个数组,array[2,3,5],表示可供选择的面额有2,3,5。现要求组成10元,有多少中方法。
我们用index表示array中当前位置,rest表示要组成的钱数。即让第index位的面额去填补rest。
在这里插入图片描述
在这里插入图片描述
2)动态规划
·Index和rest可变,先做出一个表格。array[] = {2,3,5}
在这里插入图片描述
dp[index][rest]表示用index及其后面的面值填补rest,故dp[0][10]即为目标。

·接下来看递归
在这里插入图片描述
如dp[1][10]的值会依赖dp[2]这个一行的某些值,如下图,i=0,i=1,i=2,直至越界
即绿色星号的值等于三个绿色的√值的和。
在这里插入图片描述
由于求解的顺序是从左往右(i一开始是0,那么rest-i*array[index]是递增的),所以下图问号的值的求解,是先于绿色星号的。
在这里插入图片描述
可看出问号的值等于前两个√的和。所以绿色星号的值应该依赖于问号,那就不用再去重复累加前两个√的值了。dp[index][rest] = dp[index+1][rest] + dp[index][rest-array[index]]。这就是转移方程。
记忆化所搜索只会去找,而动态规划可以通过分析找出优化的依赖方式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值