沈阳市网站设计公司大全,wordpress feed页面在哪儿,网络市场调研,深圳福田做网站518. 零钱兑换 II - 力扣#xff08;LeetCode#xff09; 这个问题是 完全背包问题 的一个变体#xff0c;可以使用 动态规划 来解决。我们定义 dp[i] 为凑成金额 i 的硬币组合数。
思路#xff1a; 定义 DP 数组 设 dp[i] 表示凑成金额 i 的组合数#xff0c;初始化 dp[…518. 零钱兑换 II - 力扣LeetCode 这个问题是 完全背包问题 的一个变体可以使用 动态规划 来解决。我们定义 dp[i] 为凑成金额 i 的硬币组合数。
思路 定义 DP 数组 设 dp[i] 表示凑成金额 i 的组合数初始化 dp[0] 1金额为 0 时只有一种方式即不选取任何硬币。 状态转移方程 对于每个硬币 coin遍历 dp[j]从 coin 到 amount更新 dp[j] dp[j]dp[j−coin]dp[j] dp[j - coin]dp[j]dp[j−coin] 这表示我们可以用 coin 这个硬币来扩展 dp[j - coin] 形成的新组合。 遍历顺序
外层遍历硬币确保组合的唯一性内层遍历金额从 coin 到 amount这样保证了组合是无序的不会重复计算顺序不同但硬币相同的组合。
class Solution:def change(self, amount: int, coins: List[int]) - int: dp [0] * (amount 1)dp[0] 1 # 凑出金额 0 只有一种方式即什么都不选for coin in coins: # 遍历每种硬币for j in range(coin, amount 1): # 遍历金额dp[j] dp[j - coin] # 累加组合数return dp[amount]复杂度分析
时间复杂度O(n × m)其中 n 是 amountm 是 coins 的数量。空间复杂度O(n)只使用了一维 dp 数组。
总结
这个问题可以通过 动态规划 解决核心思想是
dp[j] dp[j - coin] 这一公式表示用 coin 形成新组合。遍历硬币优先确保组合的唯一性。空间优化只使用一维数组 dp。