力扣518-零钱兑换 II(Java详细题解)

news2024/11/15 10:40:29

题目链接:518. 零钱兑换 II - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

最近刚学完背包,所以现在的题解都是以背包问题为基础再来写的。

如果大家不懂背包问题的话,建议可以去学一学01背包和完全背包。

如果大家感兴趣,我后期可以出一篇专门讲解背包问题。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

这里下文统一使用一维dp数组。

题目思路:

其实该题还是比较好入手,它的题目描述很清楚了,给定一个整数amount要我们求用coins里的硬币来填满它的方法数量。

如果你做过494. 目标和 - 力扣(LeetCode)的这道题,或者你看过我目标和这道题解力扣494-目标和(Java详细题解)-CSDN博客

你会发现这俩求的一样,都是求将背包装满的方法数量。

此时amount就是一个容器,coins数组里的元素就是物品,而且该物品可以重复添加,所以该问题可以抽象为一个完全背包问题。

完全背包与01背包不同的地方有俩个,一个是选择物品的数量不同。

01背包每个物品只能选一次,完全背包每个物品可以选无数次。

还有一个就是代码上的不同,代码实现选择物品的数量是不一样的。

01背包遍历dp数组的遍历顺序是先遍历物品后遍历背包,而且背包是从后往前遍历,这个才能确保每个物品只能选择一次。

而纯完全背包问题,它的dp遍历顺序先遍历物品和先遍历被背包都可以,背包是从前往后遍历,这样可以让每个物品选择多次。

01背包和完全背包的不同就讲完了,我们来具体分析分析该题。

1.确定dp数组和i下标的含义。

dp[j] 就是指装满j容量的背包的方法数量。

2.确定递推公式。

该题的递推公式和力扣494-目标和的一样,都是dp[j] += dp[j - nums[i]];

具体怎么来的如下。

每个物品只有选和不选俩种状态。不选的状态就是dp[j],因为没有选,背包容量不会减少。此时就是不选当前物品时能装满的方法的数量。

选的状态就是dp[j - nums[i]],因为此时我们选择了该物品,我们就要求在装入该物品之前的装满背包的方法种类的数量然后再放入该物品。

放入该物品的状态就是dp[j - nums[i]]。

肯定有人疑问为啥不加1呢? 此时我们是选择装入该物品,首先我们得知道装入该物品之前装满的方法数量,那么加上该物品其实并不会让该方法数量加一,已经选择了该物品,所以方法数量就是dp[j - nums[i]]。

举个例子。比如我们选择了当前物品1,此时背包容量为4。

此时选择的状态就是dp[j - 1] = dp[3]。

就是装入该物品之前装满的方法数量,而此时我们其实已经选择了装入了当前物品 ,也就是说此时装满背包容量为4选择当前物品的状态就是dp[3]。

因为这个一种方法,而不是物品的数量,如果是数量,那么加入该物品肯定是要加1,但是这是一种选择方法,我已经选择了,所以就不会加1。

所以我们的递推公式就能推出,因为每个物品只有选和不选俩个状态,所以dp[j] = dp[j] + dp[j - nums[i]];

也就是当前背包容量为j的装满的方法数量,等于他不选择当前物品和选择当前物品的总方法数量。

所以再精简点就是dp[j] += dp[j - nums[i]];

3.dp初始化。

这里的初始化也和力扣494-目标和的一样,dp[0] = 1;

具体怎么来的如下。

那么dp[0]初始化为多少呢,dp[0]其实就是当背包容量为0时,所能装满的方法数量。

背包容量为0,我们是不是能想到此时背包就是满的,因为他不能放东西嘛,所以此时对他来说也就是满的。

所以dp[0] = 1。

4.确定dp的遍历顺序。

遍历顺序就不一样了。完全背包的遍历顺序和01背包的遍历顺序就大不一样,上面有讲解。

纯完全背包问题先遍历物品或者先遍历背包都可以,但本题不一样,该题要求的其实是一种装满amount的物品组合。

组合是没有顺序的,就是选择物品组合为{1,2}和{2,1}其实是一种组合,而对于排列来说这是俩种,排列是有顺序的。

这里我就直接给出方法论,大家现阶段就会用即可,后面深入的时候可以想想具体的实现。

先遍历物品后遍历背包就是组合。先遍历背包后遍历物品就是排列。

所以该题就是要先遍历物品后遍历背包。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

举例推导dp数组。

在这里插入图片描述

最终代码:

class Solution {
    public int change(int amount, int[] coins) {
        //该题就是求装满这个背包有多少种方法
        int dp[] = new int [amount + 1];
        dp[0] = 1;
        //先物品再背包 组合
        //先背包再物品 排列  
        //这里是先物品后背包
        for(int i = 0;i < coins.length;i ++){
            for(int j = coins[i]; j <= amount;j ++){
                //dp[j] = dp[j] + dp[j - weight[i]];
                //每个元素只有选和不选 所以当背包容量为3时应该是要加上没选物品3时装满的方法和选上物品3时装满的方法
                //当背包容量为3 物品3我可以选也可以不选 不选的dp[j] 选的就是dp[j - weight[i]]
                dp[j] += dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

背包问题就是这样,思路分析一大堆,实际代码一小堆。

我们多做多理解就好。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

【重点】抓取三次握手的数据报文,分析每次握手的交互过程

1、制造三次握手的报文 三次握手是TCP&#xff08;传输控制协议&#xff09;建立连接的过程。它包括以下三个步骤&#xff1a; 1&#xff09;SYN&#xff08;同步&#xff09;&#xff1a;客户端发送一个SYN报文&#xff0c;请求与服务器建立连接。 2&#xff09;SYN-ACK&am…

text2video的step1出错,与纠正

也就是配置RWKV向外提供API访问权;并将openai的api_base改为本地访问地址。 # 设置 OpenAI 的 API 密钥 openai.api_key = "free"#os.getenv(OPENAI_API_KEY) #老版本,过时了,1.2已经不支持了 openai.api_base = "http://127.0.0.1:8000/v1" #在这里设置…

Java入门:08.Java中的static关键字

1 static关键字 可以修饰属性变量&#xff0c;方法和代码段 static修饰的属性称为静态属性或类属性&#xff0c; 在类加载时就在方法区为属性开辟存储空间&#xff0c;无论创建多少个对象&#xff0c;静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰…

图的基础概念

图和树一样&#xff0c;是一种十分重要的算法思想&#xff0c;是很多算法比如floyd算法&#xff0c;Dijkstra算法等的实现基础 一、节点和边 节点和边是图的基本组成部分&#xff0c;以公交路线图为例&#xff0c;每一个站点相当与图的节点&#xff0c;连接每一个站点的路线相…

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层 1.4输出层1.4.1softmax层 1.5损失函数1.6反向传播 2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09;2.4激活函数&…

卷轴模式系统源码开发在当今时代的多重益处

随着信息技术的飞速发展&#xff0c;数字化转型已成为各行各业不可逆转的趋势。在这一背景下&#xff0c;卷轴模式系统&#xff08;这里的“卷轴模式”可理解为一种以滚动、分层或模块化展示信息的界面设计方式&#xff0c;类似于古代卷轴展开的过程&#xff0c;但更多地是指其…

2024金砖展 | 蓝卓:“1+2+N”智能企业新架构,赋能全球工业数字化转型

2024金砖国家新工业革命展——工业互联网专题展览作为2024金砖国家新工业革命展聚焦工业互联网的专题展示区域&#xff0c;全面展示工业互联网新技术、新产品、新方案、新应用、新项目、新生态等。 展览时间&#xff1a;2024年9月8日-9月11日 展览地点&#xff1a;厦门国际会展…

FreeRTOS学习记录——持续更新

目录 入门知识&#xff1a; 裸机与FreeRTOS: 裸机&#xff1a; RTOS系统&#xff1a; 基础知识: 任务调度&#xff1a; 分类&#xff1a; 时间片调度&#xff1a; 任务状态&#xff08;四种&#xff09;&#xff1a; 四种状态图片&#xff1a; 入门知识&#xff1a; …

AV1 Bitstream Decoding Process Specification:术语和定义

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

上海市皮肤病医院引入AcrelEMS-MED平台打造绿色医院

在数字化转型的浪潮中&#xff0c;上海市皮肤病医院再次走在前列&#xff0c;宣布对其能源管理系统进行全面升级&#xff0c;引入AcrelEMS-MED医院能源管理平台&#xff0c;以科技力量推动绿色医院建设&#xff0c;为患者和医护人员打造更加安全、高效、环保的就医与工作环境。…

2024.9.9(极客大挑战 2019]EasySQL,[极客大挑战 2019]Knife)

题目一&#xff1a;极客大挑战 2019]EasySQL 1、点开题目链接&#xff0c;来到下面的界面 2、遇到这样的登录界面&#xff0c;先尝试admin和万能密码&#xff08;1 or 11#&#xff09;&#xff0c;拿到flag 题目二&#xff1a;[极客大挑战 2019]Knife 1、点开链接&#xff0c…

【C++】模板:进阶(仿函数深度剖析)

目录 一.仿函数的概念 二.仿函数的作用 三.模板的非类型模板参数 四.array 五.模板的特化 六.函数模板 七.类模板 1.全特化 2.偏特化 八.模板分离编译 一.仿函数的概念 仿函数本质就是一个类&#xff0c;此类中重载了运算() &#xff0c;因此它使用起来就和函数很像&a…

新160个crackme - 053-devilz KeyGen me#3

运行分析 解压出来4个文件运行程序发现要破解Name和Serial PE分析 32位&#xff0c;petite壳 手动脱壳 使用windows XP虚拟机OD打开程序按2下F8&#xff0c;发现ESP变红&#xff0c;根据ESP定律&#xff0c;在该地址右键 -> HW break下断点 继续按2下F9&#xff0c;来到灰色…

从0到1:中小企业如何用内容营销吸引客户,塑造品牌魅力?

今天咱们来聊聊中小企业如何通过内容营销这把“金钥匙”&#xff0c;打开客户的心门&#xff0c;同时塑造出独特的品牌魅力。别紧张&#xff0c;这其实就是一场精彩的交流盛宴&#xff0c;让我们一起探索其中的奥秘吧&#xff01; 一、内容营销&#xff1a;真诚对话的开始 想象…

OAuth 2.0 授权流程详解与 FastAPI 实现

在现代网络应用中&#xff0c;OAuth 2.0 已成为授权和认证的标准协议。它允许用户将访问权限授予第三方应用&#xff0c;而无需暴露自己的用户名和密码。本文将详细介绍 OAuth 2.0 的常见授权流程&#xff0c;并展示如何在 FastAPI 中实现这些流程。 OAuth 2.0 简介 OAuth 2…

数字化转型不是终点,数字技术服务平台如何陪伴企业持续进化?

数字化转型确实不是终点&#xff0c;而是一个持续的过程&#xff0c;它要求企业不断适应变化、优化流程、创新业务模式。数字技术服务平台在陪伴企业持续进化方面扮演着至关重要的角色&#xff0c;具体体现在以下几个方面&#xff1a; 灵活性与可扩展性&#xff1a;数字技术服…

误删文件后的数据救赎实战恢复指南

误删文件的痛与思 在数字化时代&#xff0c;数据已成为我们生活与工作中不可或缺的一部分。无论是个人用户保存的家庭照片、工作文档&#xff0c;还是企业用户存储的财务数据、客户资料&#xff0c;都承载着无法估量的价值。然而&#xff0c;误删文件这一简单却致命的操作&…

【数组与广义表】(基本概念与思路)

1.数组的定义及特点 数组&#xff1a;按一定格式排列起来的&#xff0c;具有相同类型的数据元素的集合。 1.1一维数组 若线性表中的数据元素为非结构的简单元素&#xff0c;则称为一维数组。一维数组的逻辑结构:线性结构&#xff0c;定长的线性表声明格式:数据类型 变量名称…

仪表板展示丨DataEase看中国:中国月饼行业消费趋势报告

中秋节是中国最重要的传统节日之一&#xff0c;月饼是具有浓厚节日特色的传统美食。近年来&#xff0c;月饼市场呈现出诸多新趋势和消费特点。在本文中&#xff0c;我们使用DataEase开源BI工具&#xff08;http://github.com/dataease&#xff09;对中国月饼行业的消费趋势进行…

敏捷开发方法例题

答案&#xff1a;B 敏捷方法 特点 极限编程XP 4大价值观&#xff0c;5大原则&#xff0c;12个最佳实践 水晶法 认为每一个不同的项目都需要一套不同的策略&#xff0c;约定和方法论&#xff0c;认为人对软件质量有重要影响&#xff0c;因此随着项目质量和开发人员须知的提…