爬楼梯问题,最小路径等一维DP问题分析
本文主要分析一维的动态规划问题,希望可以得到一般的接替思路和代码套路,首先放上题目。
这是一个典型的动态规划问题。
- 最优子问题:想要11的硬币数量最小,则(11-x,x)的硬币数也最小。
- 重叠子问题:可能多次求解如2的硬币数量最小
但是我们先进行从上至下的方法,并且假设硬币是按照次序排列的,可以进行试当的剪枝。
对于递归问题,我们得到递推式:f(target) =min{ f(target-coins[i])+1}
.
# 递归 递归方法,基于coins排序进行了一些剪枝
def coinformoney(self, coins, target):
# coins中的硬币是按照从小到大进行排序的,且可以重复使用
# 难点1:如何设计递归技术的边界条件和返回值。方法: 一定要分析清楚函数的目标,返回值应当与目标一致
if target < 0:
return -1
if target == 0:
return 0
# 难点2: 每次递归比较值的设计,如果是最小值设计Inf
minnums = float('Inf')
for i in range(len(coins)):
# 难点3: 递归关系的得到,子问题是什么,子问题的返回是什么
num