java零钱兑换 II(力扣Leetcode518)

零钱兑换 II

力扣原题链接

问题描述

给定一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0。假设每一种面额的硬币有无限个。

示例

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10]
输出:1

分析

这是一个典型的动态规划问题。我们需要计算可以凑成总金额的硬币组合数。可以将问题转化为两部分:背包容量为总金额amount ,物品为数组 coins

思考:我们是每次可以放入多个物品的背包问题,所以这是一个完全背包问题

因此,我们可以定义一个动态规划数组 dp,其中 dp[i] 表示总金额为 i 时的组合数。

状态定义

定义一个一维动态规划数组 dp,其中 dp[i] 表示总金额为 i 时的组合数。

状态转移方程(统计组成的种数)

对于每一个硬币 coins[j],我们有两种选择:使用该硬币或者不使用该硬币(抽象为选和不选)。因此状态转移方程为:

dp[i] += dp[i - coins[j]];

初始化

我们需要对动态规划数组进行初始化。初始时,总金额为 0 的组合数有 1 种方法,其余为 0。

遍历顺序

注意:这里要求的是组合数,即2+2+1和1+2+2和2+1+2都视为一种组合 (即不考虑顺序),那么需要先遍历物品,再遍历背包,这样求得就是物品的组合数

理解:

  • 先遍历物品的话,就先拿着物品1,再遍历每一个背包容量,再拿物品2,再遍历每一个背包容量,那么背包中就只会出现(1,2)这样的组合;不会把(2,1)重复算成一种情况。
  • 如果先遍历背包的话,就先拿着背包1,再遍历每一个物品(物品1,物品2…),再拿背包2,再遍历物品(物品1,物品2…),那么背包中就只会出现(1,2,1,2…),那么对于(1,2)来说,就会出现(1,2)和(2,1)都各自算成一种情况了。

Java解题

class Solution {public int change(int amount, int[] coins) {// 创建一个动态规划数组 dp,其中 dp[i] 表示总金额为 i 时的组合数int[] dp = new int[amount + 1];// 初始时,总金额为 0 的组合数有 1 种方法dp[0] = 1;//写法一:for(int i = 0 ; i < coins.length; i ++){// 先遍历物品for(int j = coins[i]; j <= amount; j ++){// 在遍历背包(求物品的组合数dp [j]  += dp[j-coins[i]]; // 注意这里dp数组的含义,[这里是背包容量的遍历下标]}}//写法二:// 遍历硬币数组 coinsfor (int coin : coins) {// 遍历金额从硬币面额到 amountfor (int i = coin; i <= amount; i++) {// 更新动态规划数组dp[i] += dp[i - coin]; // 注意这里dp数组的含义,[这里是背包容量的遍历下标]}}// 返回总金额为 amount 时的组合数return dp[amount];}
}

总结

通过动态规划的思想,我们可以解决这个问题。首先初始化动态规划数组,然后根据状态转移方程进行状态转移,最终返回总金额为 amount 时的组合数。

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

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

相关文章

如何使用Excel创建一个行政考勤表

在企业和机构中&#xff0c;行政考勤管理是一项重要的日常工作&#xff0c;它涉及到员工的出勤情况、请假记录、加班情况等。使用Excel创建一个行政考勤表可以帮助管理者有效地记录和跟踪员工的考勤情况&#xff0c;下面将详细介绍如何使用Excel创建一个行政考勤表。 第一部分&…

SpringMVC | SpringMVC中的 “JSON数据交互“ 和 “RESTful设计风格“

目录: 一、JSON 数据交互1.1 JSON概述1.2 JSON的“数据结构”对象结构数组结构 1.3 JSON的“数据转换”用 \<mvc:annotation-driven/>的方式 来“自动配置” MappingJackson2HttpMessageConverter转换器 (来完成JSON数据转换)用\<bean>标签方式的来“自行配置” JS…

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图&#xff0c;至少有n-1条边&#xff0c;而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边&#xff0c;则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

如何在Linux系统部署Dupal CMS结合内网穿透实现无公网IP访问web界面

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&a…

【OpenCV C++Python】(五)图像平滑(模糊)

文章目录 图像平滑均值滤波高斯滤波中值滤波双边滤波(Bilateral Filtering ) PythonC 图像线性平滑空间滤波&#xff08;加权均值滤波器&#xff0c;几何均值滤波&#xff0c;谐波均值滤波&#xff0c;逆谐波均值滤波&#xff09;&#xff0c;非线性平滑空间滤波&#xff08;中…

unity 加载BMP格式图片数据流

创建BMPLoader.cs 此方法是用来将数据流解析成texture&#xff0c;BMP数据流不同于其他图片数据&#xff0c;所以需要特殊处理 #region License and Information /***** * * BMPLoader.cs * * This is a simple implementation of a BMP file loader for Unity3D. * Formats…

Go语言的流行框架 ,能够根据数据表直接生成程序、语言包和界面的并不多见,希望哪个大神,做一个

基于Go语言的框架中&#xff0c;能够根据数据表直接生成程序、语言包和界面的并不多见&#xff0c; 希望哪个大神&#xff0c;做一个 因为Go语言更侧重于性能和并发性&#xff0c;而这类自动生成的功能往往与具体的业务逻辑和界面需求紧密相关&#xff0c;这通常是前端框架或全…

Linux下QT界面小程序开发

背景&#xff1a;需要在linux不同环境下可以测试我们的读卡器设备 搭建本地linux开发环境&#xff08;本来想VS里开发然后通过SSH的方式在linux下编译&#xff0c;但是工具链一直没搞起来&#xff0c;所以我是在ubuntu里安装的QT Creator工具直接开发的&#xff09;&#xff1b…

ARMday6作业

1&#xff0c;串口字符串收发现象实现图 2.串口控制灯亮灭 main.c #include "uart4.h"//封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} }int strcmp(char *a1,char *a2) {int i0;while(a1[i]a2[i]){if(a1[i]\0){break;} i;}…

C# 主窗体中显示子窗体(MDI)

1.示例代码&#xff0c;假如主窗体为MainForm,有三个子窗体分别是&#xff1a;Form1&#xff0c;Form2&#xff0c;Form3 public partial class MainForm : Form {public MainForm(){InitializeComponent();}Form1 form1 new Form1(); //子窗体1Form2 form2 new Form2(); //…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…

windowsVMware虚拟机中扩展linux磁盘空间

1.虚拟磁盘扩容 VM中&#xff0c;关闭linux虚拟机&#xff0c;直接编辑虚拟机-硬盘-扩展磁盘容量 2.通过Gparted工具进行LINUX系统磁盘分区 未分区挂载前可以看到/挂载点下空间为20G&#xff1a; 通过虚拟机-快照-拍摄快照&#xff0c;操作前可拍摄快照&#xff08;便于恢复之前…

FPGA高速接口的学习途径,全套课程

​FPGA高速接口有哪些学习途径&#xff0c;这里不得不提下我们宸极教育FPGA课程&#xff0c; FPGA课程5.0 版&#xff1a;Xilinx体系高速接口项目实操&#xff0c;全新升级&#xff0c;课程完全根据企业招聘要求&#xff0c;项目实操设置&#xff0c;适应目前市场的求职招聘要…

FastJson序列化隐藏特性

针对训练模型控制台的web后端维护&#xff0c;新增了一个int类型的maxTokenLimit字段&#xff0c;表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后&#xff0c;数据库里面这个字段项没有填充数值&#xff0c;默认是空&#xff0c;所以理论上当maxTokenLimit字段为空…

半加器___

1.原理 2.代码 2.1 half_adder.v module half_adder (input wire in_1 ,input wire in_2 ,output wire sum ,output wire count );assign {count,sum}in_1in_2;endmodule 2.2 tb_half_adder.v timescale 1ns/1nsmodule tb_half_adder();reg in_1; reg in_2;wire su…

ThreaTrace复现记录

1. 环境配置 服务器环境 需要10.2的cuda版本 conda环境 包的版本&#xff1a; python 3.6.13 pytorch 1.9.1 torch-cluster 1.5.9 torch-scatter 2.0.9 torch-sparse 0.6.12 torch-spline-conv 1.2.1 torch-geometric 1.4.3 环境bug 这里环境搭建好以后&#xff0c;就可以正…

使用Python和PIL将RGB转换为三通道灰度图

将彩色图像转换为多通道的灰度图意味着保持图像数据的形状不变&#xff0c;但将每个像素的彩色表示转换为灰度值。通常灰度图像是单通道的&#xff0c;但如果想保持原图的三通道结构&#xff0c;可以用相同的灰度值填充每个通道。 彩色图像通常以RGB&#xff08;红、绿、蓝&am…

MySql实战--深入浅出索引(下)

在开始这篇文章之前&#xff0c;我们先来看一下这个问题&#xff1a; 在下面这个表T中&#xff0c;如果我执行 select * from T where k between 3 and 5&#xff0c;需要执行几次树的搜索操作&#xff0c;会扫描多少行&#xff1f; 下面是这个表的初始化语句。 图1 InnoDB的索…

Ubuntu下搭建UEFI下PXE服务端(详细)总结

目录 一、简介二、HTTP服务端搭建三、DHCP服务端搭建四、TFTP服务端搭建五、重启所有服务、关闭防火墙六、其他相关链接1、Windows下EDK2快速搭建过程总结附软件包地址2、PXE安装Linux系统原理详解3、Ubuntu系统设置常见问题处理详细总结4、UEFI下命令参数详解快速掌握 一、简介…

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…