当前位置: 首页 > news >正文

python-leetcode-零钱兑换 II

518. 零钱兑换 II - 力扣(LeetCode)

这个问题是 完全背包问题 的一个变体,可以使用 动态规划 来解决。我们定义 dp[i] 为凑成金额 i 的硬币组合数。

思路:

  1. 定义 DP 数组
    dp[i] 表示凑成金额 i 的组合数,初始化 dp[0] = 1(金额为 0 时只有一种方式,即不选取任何硬币)。

  2. 状态转移方程
    对于每个硬币 coin,遍历 dp[j](从 coinamount),更新 dp[j]

    dp[j]+=dp[j−coin]dp[j] += dp[j - coin]dp[j]+=dp[j−coin]

    这表示我们可以用 coin 这个硬币来扩展 dp[j - coin] 形成的新组合。

  3. 遍历顺序

  • 外层遍历硬币(确保组合的唯一性)
  • 内层遍历金额(从 coinamount
  • 这样保证了组合是无序的,不会重复计算顺序不同但硬币相同的组合。
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),其中 namountmcoins 的数量。
  • 空间复杂度:O(n),只使用了一维 dp 数组。

总结

这个问题可以通过 动态规划 解决,核心思想是:

  • dp[j] += dp[j - coin] 这一公式表示用 coin 形成新组合。
  • 遍历硬币优先,确保组合的唯一性。
  • 空间优化:只使用一维数组 dp
http://www.lryc.cn/news/546976.html

相关文章:

  • 【RabbitMQ】Producer之TTL过期时间 - 基于AMQP 0-9-1
  • 演示汉字笔顺的工具
  • JVM简单了解
  • 【CSS—前端快速入门】CSS 选择器
  • 【MYSQL数据库异常处理】执行SQL语句报超时异常
  • 【Day9】make/makeFile如何让项目构建自动化起飞
  • 【单片机】嵌入式系统的硬件与软件特性
  • C语言学习笔记-初阶(30)深入理解指针2
  • ROM修改进阶教程------修改安卓机型SELinux宽容的几种方式方法 以及第三方系统中如何关闭SELinux宽容
  • 亚马逊云科技Marketplace(中国区)上架专业服务产品, “云生态连接器”价值凸显
  • 【音视频】音频基础
  • 策略模式的C++实现示例
  • 本地部署pangolin获取谱系,从而达到预测新冠的流行趋势
  • 【我的 PWN 学习手札】House of Emma
  • 4 Redis4 List命令类型讲解
  • CentOS 7 安装 Redis6.2.6
  • 数据库原理4
  • doris: MySQL
  • Django模型数据删除:详解两种方式
  • C++并发以及多线程的秘密
  • 自学微信小程序的第十二天
  • ⭐算法OJ⭐跳跃游戏【贪心算法】(C++实现)Jump Game 系列 I,II
  • 带你从入门到精通——自然语言处理(五. Transformer中的自注意力机制和输入部分)
  • ubuntu挂载固态硬盘
  • WPF+WebView 基础
  • 国内光子AI智能引擎:OptoChat AI在南京江北新区亮相
  • vscode离线配置远程服务器
  • 【安装】SQL Server 2005 安装及安装包
  • 使用Maven搭建Spring Boot框架
  • 将docker容器打包为.tar包