上篇中对找零钱题目进行了第二种方法的探索,这次将使用经典的动态规划方法,求解这道题目。
对于记忆搜索法来说,这基本是动态规划的雏形。就是减少重复递归的次数,但记忆搜索法是无序的记忆,遇到一个记录一个,没什么规律。经典的动态规划方法就是按照一定的次序和规律记录每一次递归的值。看下边的例子。
对于penny{1,3,6},aim=13这个条件来说,定义一个二维数组,行为N(N为penny的长度)即就是3,列为目标值加1就是14。map[2][13]数组(因为数组从0开始)的每一个map[i][j]代表的含义是:使用penny[0~i]区间的货币种类,组合成目标为j的金额,一共有的方法数。
对于每一个具体的map[i][j]求解方法为:
使用0张penny[i]货币,其余使用penny[0~i-1]货币种类时,此时的方法数为map[i-1][j]。
使用1张penny[i]货币,其余使用penny[0~i-1]货币种类时,此时的方法数为map[i-1][j-penny[i]*1]。
使用x张penny[i]货币,其余使用penny[0~i-1]货币种类时,此时的方法数为map[i-1][j-penny[i]*x]。
而map[i][j]的值为以上各值的累加。
用上边的例子做成表格帮助理解
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|
动态规划解析:找零钱问题

本文通过一个找零钱的题目,详细介绍了动态规划的原理和实现过程,包括如何构建二维数组并按照一定顺序计算每个元素,以及动态规划优化版的代码示例。动态规划是从暴力求解逐步优化,帮助理解这类问题的解决思路。
最低0.47元/天 解锁文章
5898

被折叠的 条评论
为什么被折叠?



