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

【经典算法】Leetcode-零钱兑换问题

一、题目

  • 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
  • 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
  • 你可以认为每种硬币的数量是无限的。

示例 1:
输入:coins = [1, 5, 11], amount = 15
输出:3
解释:11 = 5 + 5 + 5

二、思考

方法列举:

  • 贪心:根据贪心法则,会先挑最大的,这样的话,会先选择10块的,然后选择1块的,选择过程是:10+1+1+1+1=15,这样显然不是本题的最优解
  • 动态规划:假设 F[i] 表示组成金额i所需的硬币数量,那么F[i] 可能有多种结果,按照题意,选择其中最小的一个结果输出即可。比如F[15]有三种不同的兑换方法(兑换次数分别为5、3、5),最终输出3即可。

在这里插入图片描述

三、动态规划解法

采用以上动态规划的思路,可以将以上过程拆成2个步骤:

  1. 计算第一次挑选每个硬币coin,对应的F[i]:F[i] = F[i - coin] + 1
  2. 及时更新最小值: F[i] = min(F[i], F[i - coin] + 1)

Python代码:

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [inf] * (amount + 1)  # 定义dp[i]表示,组成金额i所需的最少硬币数量
        dp[0] = 0

        for coin in coins: # 计算逐个硬币下的dp[i]
            for i in range(coin, amount + 1):
                dp[i] = min(dp[i], dp[i - coin] + 1) # 在计算过程中,还实时比较得到最小的f[i]

        return dp[amount] if dp[amount] != inf else -1

Ref:

  • Leetcode: https://leetcode.cn/problems/coin-change/?envType=study-plan-v2&envId=top-100-liked
http://www.dtcms.com/a/64315.html

相关文章:

  • [高阶技术了解]WebRPC详解
  • MongoDB Vs Elasticsearch
  • Jatpack Room 数据库封装:简洁、通用、高性能的持久化解决方案
  • 开启AI开发新时代——全解析Dify开源LLM应用开发平台
  • maven wrapper的使用
  • 【Godot4.4】写入和读取ZIP文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)
  • React.js 基础与进阶教程
  • 【网络安全 | 漏洞挖掘】四链路账户接管
  • 视频理解之Actionclip(论文宏观解读)
  • SQL日期处理
  • Java的JDBC编程
  • BFS最短路径(十七)675. 为高尔夫比赛砍树 困难
  • 图像识别技术与应用(十六)
  • 科技工作者之家建设扬帆起航,为科技人才提供更多优质服务
  • lua C语言api学习1 编译第一个程序
  • 【巨人网络】25届春招、26届实习内推码,面经
  • nginx反向代理应用
  • SMC自修改
  • 二进制安装指定版本的MariaDBv10.11.6
  • 珠算之珠心算观想算盘
  • 基于Python+Vue开发的鲜花商城管理系统源码+运行步骤
  • 深度学习基础:线性代数本质4——矩阵乘法
  • 机器学习之超参数优化(Hyperparameter Optimization)
  • 【leetcode hot 100 23】合并K个有序链表
  • 图像识别技术与应用-YOLO
  • AI日报 - 2025年3月13日
  • Spring Boot 整合 Druid 并开启监控
  • 软件版本号设计
  • IEC61850标准下MMS 缓存报告控制块 ResvTms详细解析