518.零钱兑换II
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp=[[0]*(amount+1) for _ in range(len(coins))]
#amount考虑等于0的情况,coins只考虑存在的coin
for i in range(amount+1):
if i%coins[0]!=0:
dp[0][i]=0
else:
dp[0][i]=1
for i in range(len(coins)):
dp[i][0]=1
for i in range(1,amount+1):
for j in range(1,len(coins)):
#第一行和第一列已经初始化,可以不计算
if coins[j]>i:
dp[j][i]=dp[j-1][i]
else:
dp[j][i]=dp[j-1][i]+dp[j][i-coins[j]]
return dp[len(coins)-1][amount]
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
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[amount]
377. 组合总和 Ⅳ
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
nums = [1, 2, 3]
target = 4
所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)
请注意,顺序不同的序列被视作不同的组合。
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp=[0]*(target+1)
dp[0]=1
for i in range(1,target+1):
#第一个的情况已考虑
for j in range(len(nums)):
if i>=nums[j]:
dp[i]+=dp[i-nums[j]]
return dp[target]