深入浅出算法题-零钱兑换的动态规划问题
深入浅出算法题-零钱兑换的动态规划问题
一、 零钱兑换:硬币的最少个数
-
给一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
-
计算并返回可以凑成总金额所需的最少硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1 。
-
可认为每种硬币的数量是无限的。
解题关键点
-
经典的动态规划问题。
-
设置一个数组dp,其中每个元素dp[i]记录的是,当金额为i时,所需要的硬币个数。则题目所求为dp[amount]。
-
考虑基础简单的例子。有dp[0] = 0,也就是说,金额为0所需的硬币个数是0。
-
考虑状态转移公式。从小到大遍历金额数,这样,可以保证:当我们计算金额i所需的最少硬币个数dp[i]时,前面更少的金额所需要的最少硬币个数,比如dp[i-1]、dp[i-2]······等都已求出。
-
那么,对任意的dp[i],面对某种硬币的面额(记为coin),如果在凑成金额i时选择了这枚硬币,那么在凑成金额(i-coin)时所需要的硬币个数 + 1即可。也就是dp[i] = dp[i-coin] + 1。
-
class Solution(object):
-
def coinChange(self, coins, amount):
-
"""
-
:type coins: List[int]
-
:type amount: int
-
:rtype: int
-
"""
-
# 初始化为正无穷大
-
dp = [float('inf')]*(amount+1)
-
-
# 金额为0,所要凑的硬币个数也为0
-
dp[0] = 0
-
-
for coin in coins:
-
sum_coin = coin
-
-
while sum_coin < (amount+1):
-
dp[sum_coin] = min(dp[sum_coin], dp[sum_coin-coin]+1)
-
sum_coin += 1
-
-
# print(dp)
-
return dp[amount] if dp[amount]!= float('inf') else -1
二、零钱兑换:硬币的组合总数
-
给一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
-
计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
-
假设每一种面额的硬币有无限个。
解题关键点
-
经典的动态规划问题。
-
设置一个数组dp,其中每个元素dp[i]记录的是,当凑成金额为i时,所有的硬币组合的总数。则题目所求为dp[amount]。
-
考虑基础简单的例子。有dp[0] = 1,也就是说,金额为0时,只有1种选择,就是什么硬币都不取。
-
考虑状态转移公式。从小到大遍历金额数,这样,可以保证:当我们计算金额i的硬币组合数dp[i]时,前面更少的金额的组合数比如dp[i-1]、dp[i-2]······等都已求出。
-
那么,对任意的dp[i],面对某种硬币的面额(记为coin),如果在凑成金额i时选择了这枚硬币,那么它也包含了凑成金额(i-coin)时的组合个数。而对不同面值的硬币coin,都需要累加所有的组合个数。
-
class Solution(object):
-
def change(self, amount, coins):
-
"""
-
:type amount: int
-
:type coins: List[int]
-
:rtype: int
-
"""
-
-
dp = [0]*(amount+1)
-
dp[0] = 1
-
-
for coin in coins:
-
sum_coin = coin
-
-
while sum_coin <= amount:
-
dp[sum_coin] += dp[sum_coin-coin]
-
sum_coin += 1
-
-
return dp[amount]
本文仅作学术分享 侵删
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2015-10-19 神经网络简史
2015-10-19 Facebook人工智能实验室的前世今生
2015-10-19 专访吴恩达:我不关心人工智能是否变邪恶