322. 零钱兑换
思路
动态规划
这道题目可以用动态规划,因为满足了使用动态规划的几个特点:求最值,最优子结构(即主问题是最优解时,子问题也是最优解)。由于还符合了重叠子问题的情况(即一个子问题被多次求解),所以可以使用备忘录的技术,使用一个数组记录子问题的答案。
技术总结
- 使用amount+1这个不可能的数作为 备忘录的默认值,以表示备忘录的对应位置没有记录
- 对于没有解的情况,在备忘录中用-1表示
代码
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
mem = [amount+1 for i in range(amount+1)]
def dp(need):
if 0 == need:
return 0
if need < 0:
return -1
nonlocal mem
if mem[need] != amount+1:
return mem[need]
flag = True
for i in coins:
x = dp(need - i)
if x < 0:
continue
else:
mem[need] = min(mem[need],x+1)
flag = False#有解
if flag:#不可解
mem[need] = -1
return mem[need]
return dp(amount)