每日leetcode4.14-零钱兑换-补
518.零钱兑换II
今天突然有同学问到这种题,就去leetcode搜索这类题,经典背包问题
我还是惯性使用了二维dp,实际上简单一维dp
题目:给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
样例:输入: amount = 5, coins = [1, 2, 5]; 输出: 4
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount + 1)
dp[0] = 1
for i in coins:
for j in range(amount + 1):
if j >= i:
dp[j] += dp[j - i]
return dp[amount]
322.零钱兑换
顺便做一下相关题
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [0] * (amount + 1)
for i in range(1, amount + 1):
dp[i] = 0xffff
for j in coins:
if i >= j:
dp[i] = min(dp[i - j] + 1, dp[i])
if dp[amount] == 0xffff:
return -1
return dp[amount]