LeetCode刷题复盘笔记—一文搞懂完全背包之322. 零钱兑换问题(动态规划系列第十四篇)

news2024/9/21 0:46:41

今日主要总结一下动态规划完全背包的一道题目,322. 零钱兑换

题目:322. 零钱兑换

Leetcode题目地址
题目描述:
给你一个整数数组 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

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

本题重难点

这是一道典型的背包问题,本题给定的数组里面的元素可以重复取,所以这是一个完全背包。

在动态规划:518.零钱兑换II (opens new window)中我们已经兑换一次零钱了,这次又要兑换,套路不一样!

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。

动规五部曲分析如下:

  1. 确定dp数组以及下标的含义
    dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

  2. 确定递推公式
    凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])
    所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。
    递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

  3. dp数组如何初始化
    首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
    其他下标对应的数值呢?
    考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。
    所以下标非0的元素都是应该是最大值。
    代码如下:


vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;

其实判断如何初始化重要一点就是看dp是取之前状态最小值还是最大值,如果最小值就大概率INT_MAX,最大值就大概率0。

  1. 确定遍历顺序
    本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。
    所以本题并不强调集合是组合还是排列。
    如果求组合数就是外层for循环遍历物品,内层for遍历背包。
    如果求排列数就是外层for遍历背包,内层for循环遍历物品。

    在动态规划之前文章我们讲过了求组合数是一文搞懂完全背包之518. 零钱兑换 II问题,求排列数是一文搞懂完全背包之377. 组合总和 Ⅳ问题
    所以本题的两个for循环的关系是:外层for循环遍历物品,内层for遍历背包或者外层for遍历背包,内层for循环遍历物品都是可以的!
    那么我采用coins放在外循环,target在内循环的方式。
    本题钱币数量可以无限使用,那么是完全背包。所以遍历的内循环是正序
    综上所述,遍历顺序为:coins(物品)放在外循环,target(背包)在内循环。且内循环正序。

  2. 举例推导dp数组

以输入:coins = [1, 2, 5], amount = 5为例
在这里插入图片描述

C++代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int>dp(amount + 1, INT_MAX);
        dp[0] = 0;
        for(int i = 0; i < coins.size(); i++){
            for(int j = coins[i]; j <= amount; j++){
                if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j] = min(dp[j], dp[j - coins[i]] + 1);
                }
            }
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

C++测试用例有两个数相加超过int的数据,所以需要在if里加上
dp[i] < INT_MAX - dp[i - num]。


总结

动态规划
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的

对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

这篇文章主要总结了一些动态规划解决322. 零钱兑换问题,依然是使用动规五部曲,做每道动态规划题目这五步都要弄清楚才能更清楚的理解题目!

判断如何初始化重要一点就是看dp是取之前状态最小值还是最大值,如果最小值就大概率INT_MAX,最大值就大概率0。

在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。

  • 如果求组合数就是外层for循环遍历物品,内层for遍历背包。(也就是0-1背包一维dp数组常用写法)

  • 如果求排列数就是外层for遍历背包,内层for循环遍历物品。

而本题是要求最少硬币数量,硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!

欢迎大家关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB绘制伪彩图和切片轮廓线图

n6%定义轮数 r(0:n)/n;%定义轮的半径 thetapi*(-n:n)/n;%定义轮的扇区角 Xr*cos(theta); Yr*sin(theta);%定义网格顶点 Cr*cos(2*theta);%定义色图 pcolor(X,Y,C)%绘制伪彩图axis equal tight[x y z v]flow;%打开水流数据 hcontourslice(x,y,z,v,[1:9],[],[0],linspace(-8,2,10…

【面试题】http协议

1. http状态码 1xx&#xff1a;服务器收到请求&#xff0c;但是没有返回结果。2xx&#xff1a;请求成功。200成功。3xx&#xff1a;重定向。301永久重定向&#xff0c;302临时重定向&#xff0c;304资源未被修改。4xx&#xff1a;客户端错误。404资源未找到&#xff0c;403没有…

[附源码]计算机毕业设计基于Springboot药品仓库及预警管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

引擎入门 | Unity UI简介–第2部分(4)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 6.添加设置对话框 7.设置对话框的背景图像 8.添加标签 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&…

Xylan-Alkyne木聚糖-炔基|炔基-PEG-木聚糖

Xylan-Alkyne木聚糖-炔基|炔基-PEG-木聚糖 中文名称&#xff1a;木聚糖-炔基 英文名称&#xff1a;Xylan-Alkyne 别称&#xff1a;炔基修饰木聚糖&#xff0c;炔基-木聚糖 还可以提供PEG接枝修饰木聚糖&#xff0c;Xylan-PEG-Alkyne 木聚糖-聚乙二醇-炔基&#xff0c;炔基-…

​创业15年,50岁回到农村过上退休的生活,上班和创业是两难的选择。

我是老马&#xff0c;现在在农村老家生活1个月。 15年前&#xff0c;大学毕业三年后&#xff0c;在县城里搞到一份稳定的工作&#xff0c;朝九晚五&#xff0c;不慌不忙&#xff0c;结婚生子&#xff0c;后来又这样安安稳稳的过了10年&#xff0c;攒了一些钱&#xff0c;但生活…

【HTML学生作业网页】基于HTML+CSS+JavaScript仿南京师范大学泰州学院(11页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

llvm-ir之核心类设计

llvm-ir之核心类设计引言1 逻辑关系2 class Module3 class IRBuilder4 class Instruction5 class Constant引言 llvm IR是llvm对代码的一种中间表示。它来源AST(抽象语法树)&#xff0c;是llvm代码优化的主要对象。 1 逻辑关系 IR的很多组成元素都是以Value为基类。llvm并没有…

【web3空投】SINSO 主网公测空投

Web3.0 基础设施简化去中心化的热数据缓存和数据治理 文章目录1. SINSO Token介绍2. SINSO 主网公测空投2.1 时间2.2 奖励2.3 参与方式2.3.1 第一步(必须完成)2.3.2 第二步(成为矿工)2.3.3 第三步(成为节点担保人)2.3.4 第四步&#xff1a;公开测试反馈表3. 注意事项4. 成为矿工…

这几个方法让你实现EXCEL文件翻译成中文

在日常的工作中&#xff0c;如果遇到需要将EXCEL翻译成其它语言的的时候&#xff0c;我们该怎么办呢&#xff1f;一行一行的复制查找&#xff0c;然后再粘贴回表格中吗&#xff1f;这样操作的话&#xff0c;不仅浪费时间和精力&#xff0c;而且效率还非常的低。那有什么方法可以…

Java项目:SSM图书馆图书管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 读者角色包含以下功能&#xff1a; 读者登录,图书查询,借阅图书,借阅管理,修改密码,借阅记录等功能。 管理员角色包含以下功能&#xff1a; 管理…

Android 系统启动到App 界面完整详解~

通过本篇文章&#xff0c;你将了解到&#xff1a; Android 系统启动流程概览ServiceManager 进程作用Zygote 进程创建与fork子进程system_server 进程作用App 与 system_server 交互Activity 与 View的展示全流程图 1. Android 系统启动流程概览 init 是用户空间的第一个进程&a…

ARM基础(1):Cortex-M3寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器&#xff0c;但是一些16位的Thumb指令只能访问R0到R7(低寄存器)&#xff0c;而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 所有的寄存器如下图所示&…

Java安全--篇四-Java原生反序列化

Java原生序列化和反序列化 看理论&#xff1a; 序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化 java序列化与反序列化全讲解_mocas_wang的博客-CSDN博客_java反序列化 java 序列化和反序列化 - xbwang520 - 博客园 序列化和反序列化的简单图解&am…

[附源码]Python计算机毕业设计Django微录播室预约管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【计算机网络】超详细——VLAN、Trunk的配置

1、VLAN 1.1 什么是VLAN&#xff1f; VLAN&#xff1a;即Virtual Local Area Network&#xff08;虚拟局域网&#xff09;&#xff0c;是物理设备上连接的不受物理位置限制的用户的一个逻辑组&#xff0c;将一个物理LAN划分成多个广播域的通信技术&#xff1b;每一个VLAN是一…

想要高效运行SolidWorks,云上设计了解一下

SolidWorks是达索系统&#xff08;Dassault Systemes S.A.&#xff09;旗下SolidWorks公司开发的&#xff0c;运行在微软Windows平台下的第一个三维机械设计软件&#xff0c;涵盖非常广泛的横截面制造业细分市场&#xff0c;目前广泛应用在航天、建筑、汽车生产企业、模具生产企…

[附源码]Python计算机毕业设计Django农产品销售网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

C语言学习之路(基础篇)—— 文件操作(下)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 文件的随机读写 1) fseek 表头文件&#xff1a;#include <stdio.h>定义函数&#xff1a;int fseek(FILE *stream, long offset, int whenc…

【网络层】BGP协议详解、三种路由协议总结

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录BGP协议------外部网关协议----BGP发言人交换网络可达性信息树形结构---防止兜圈子---交换完整路径信息---路径向量BGP格式---应用层协议-------TCP传送-----先建立TCP连接-----建立BGP session---利用会话交…