518. 零钱兑换 II
解题思路:完全背包
先物品后背包(组合问题)
先背包后物品(排列问题)
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
#dp[j] 凑成金额为j有dp[j]种方法
#初始化
dp = [0] * (amount + 1)
dp[0] = 1
# 都顺序遍历,必须先物品后背包(组合)
for i in range(len(coins)):
for j in range(coins[i],amount+1):
#递推公式
dp[j] += dp[j-coins[i]]
return dp[-1]
377. 组合总和 Ⅳ
解题思路:完全背包
先背包后物品(排列问题)
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
#凑成目标正整数为j的排列个数为dp[j](排列问题)
#初始化
dp = [0] * (target+1)
dp[0] = 1
#遍历顺序(先背包后物品)
for j in range(0,target+1):
for i in range(len(nums)):
if j >= nums[i]:
#递推公式
dp[j] += dp[j-nums[i]]
return dp[-1]