518. 零钱兑换 II:
代码思路
方法1
递推式好像差不多,只是说初始化不太一样罢了。
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [[0 for j in range(amount+1)] for i in range(len(coins))]
for j in range(len(dp[0])):
if j >= coins[0] and j % coins[0] == 0:
dp[0][j] = 1
for i in range(len(dp)):
dp[i][0] = 1
for i in range(1, len(coins)):
for j in range(len(dp[0])):
if j < coins[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j]
return dp[-1][-1]
方法2
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
# dp[i][j] 代表啥呢?
# 题目是啥就是啥一般
# i代表前i个数
# j代表和
# 解题关键:第一步还是i选或者不选
# 但是第二步是i选几个?
# 可以选一个也可以选很多个知道超出j
dp = [[0 for i in range(amount+1)] for i in range(len(coins)+1)]
dp[0][0] = 1
for i in range(1, len(coins)+1):
for j in range(amount+1):
dp[i][j] = dp[i-1][j]
for k in range(1, int(j / coins[i-1])+1):
dp[i][j] += dp[i-1][j-k*coins[i-1]]
return dp[len(coins)][amount]```
# 377. 组合总和 Ⅳ:
---
代码思路
回溯法,超时
```python
class Solution:
def __init__(self):
self.anws = 0
def combinationSum4(self, nums: List[int], target: int) -> int:
def dfs(nums, target, cur_sum):
if cur_sum > target:
return
if cur_sum == target:
self.anws += 1
return
for i in range(len(nums)):
dfs(nums, target, cur_sum + nums[i])
dfs(nums, target, 0)
return self.anws