Leetcode 322. Coin Change
题目
解法1:recursion + memorization
这是很经典的完全背包问题。还是跟其他背包问题一样,从recursion的做法开始,也就是所谓的top down approach。要理解这个top down就看看下面这张图就行。
从图里可以看出,这边problem和subproblem的关系是这样的,F(S) = F(S-coin)+1,只要注意对recursion block的返回条件即可,具体如下:
- recursion的时候传的参数为remain,代表剩下需要组成的sum
- 若remain<0,代表当前路径不符合要求,返回一个无穷大值
- 若remain=0,则返回0,代表当前路径符合要求并且已经结束
- 否则的话,向下探索当前remain减去所有可能的coin的subproblem
- 通过上面的图我们可以发现,很多subproblem会被重复计算,为了节省时间,通过一个字典来储存已经得到的sub problem的解
python代码如下:
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int
def dfs(remain):
if remain<0:
return float(