上篇中对找零钱题目进行了第二种方法的探索,这次将使用经典的动态规划方法,求解这道题目。
对于记忆搜索法来说,这基本是动态规划的雏形。就是减少重复递归的次数,但记忆搜索法是无序的记忆,遇到一个记录一个,没什么规律。经典的动态规划方法就是按照一定的次序和规律记录每一次递归的值。看下边的例子。
对于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 | 10 | 11 | 12 | 13 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 |