今天给大家分享一道动态规划的常考题,零钱兑换,很有趣的动态规划题目,希望可以对大家找工作过程中起到帮助,帮助大家拓展下思维
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:
coins = [1, 2, 5], amount = 11
输出:3 解释:11 = 5 + 5 + 1
示例 2:
输入:coins = [2], amount = 3 输出:-1
示例 3:
输入:coins = [1], amount = 0
输出:0
Problem: 322. 零钱兑换
文章目录
- 解题过程
- 复杂度
- Code
解题过程
使用动态规划的解法,定义dp[i]为:凑够金额i所用到最小多少枚硬币,,定义硬币面额为c,遍历所有的硬币面额,我们可以发现这样一个转移关系,如果此时i>=c,则:
d p [ i ] = d p [ i − c ] + 1 dp[i] = dp[i-c]+1 dp[i]=dp[i−c]+1
最初我们定义所有的dp为极大值,dp[0]为0(因为凑过0元需要0个硬币),我们的目标值为target,最终返回dp[target]即可
复杂度
- 时间复杂度,假设目标值为m,有n个硬币: O ( m ∗ n ) O(m*n) O(m∗n)
- 空间复杂度: O ( m ) O(m) O(m)
Code
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [inf] * (amount+1)
dp[0] = 0
for i in range(1,amount+1):
for c in coins:
if i>=c:
dp[i] = min(dp[i],dp[i-c] + 1)
return dp[amount] if dp[amount]!=inf else -1