零钱兑换——使用动态规划,求解——Java

322. 零钱兑换 - 力扣(LeetCode)

        —— 凑成总金额的最少硬币个数

使用动态规划,二维数组缓存每种价值使用的硬币数,最后得到amount价值时最少的硬币数

                0       1       2       3       4       5 --> 钱值

            1   0       1       11      111     1111    11111

            2   0       1       2        21        22      221

            5   0       1       2        21        22      5

换成对于硬币数量后:

                0       1       2      3     4    5 --> 钱值

            1   0       1       2      3     4    5

            2   0       1       1      2     2    3

            5   0       1       1      2     2    1

结果即为 1

能凑成 --> 当前硬币面值比所要填充的钱值**小**时,需填充的硬币数是 1 加上钱值 - 硬币面值时的最少硬币数,该结果若比上一行小则使用该值,否则还是使用上一行的值

例如:第二行第三列的21,即一个2硬币和一个1硬币,硬币数为2,一个2硬币是因为,2 < 3,一个1硬币是因为3-2 = 1,在钱值为1时中去找硬币数最少的结果是1,

不能凑成 --> 当前硬币面值比所要填充的钱值**大**时,使用一个最大值,这里规定为amount+1,因为硬币数不可能超过amount,超过表示不能凑成,返回-1

例如:amount = 2,coins[] = {3},想要用3面值的硬币凑成2是不可能的,返回-1

  0  1  2  3

  0  4  1  5

-1

结果返回,在最后一个硬币数,即dp[coins.length - 1][amount] 大于amount则返回-1,否则返回对应硬币数,就为最少硬币数。

最后对二维代码降维优化处理。

    /*** 求凑成 amount 值的最少硬币数** @param amount* @param coins  硬币* @return 最少硬币数*/private int dpChange2(int amount, int[] coins) {int[][] dp = new int[coins.length][amount + 1]; //缓存使用的硬币数//第一行,使用 1 硬币for (int j = 1; j < amount + 1; j++) {if (coins[0] <= j) { //能放下dp[0][j] = 1 + dp[0][j - coins[0]];} else { //放不下dp[0][j] = amount + 1; //放一个最大值}}for (int i = 1; i < coins.length; i++) {for (int j = 0; j < amount + 1; j++) {int upCnt = dp[i - 1][j];if (j >= coins[i]) {dp[i][j] = Math.min(upCnt, 1 + dp[i][j - coins[i]]);} else {dp[i][j] = upCnt;}}}int res = dp[coins.length - 1][amount];return res >= amount + 1 ? -1 : res;}

可优化的地方:

第一行硬币数初始化,换成填充为最大值amount+1,自然第一个数为0,因为钱值为0,凑成硬币数也为0。

换成一维数组后,else部分就不需要了

第二成for循环中,要在j >= coins[i]即钱值大于硬币面值时才计算最小硬币数,和不让j从该面值开始,if条件也不需要了

降维优化后的结果:

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1]; //缓存使用的硬币数//dp数组初始化Arrays.fill(dp, amount + 1);dp[0] = 0;//计算每种价值时的所需最少硬币数for (int coin : coins) for (int j = coin; j < amount + 1; j++) {dp[j] = Math.min(dp[j], 1 + dp[j - coin]);}return dp[amount] >= amount + 1 ? -1 : dp[amount];}}

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

    0       1       2       3       4       5 --> 钱值
1   1       1       11      111     1111    111112   1       1       11      111     1111    111111       2       21      211     211122      221
5   1       1       11      111     1111    111111       2       21      211     211122      2215结果:4 种0       1       2      3     4    5 --> 钱值
1   1       1       1      1     1    1
2   1       2       2      2     3    3
5   1       2       2      2     3    4 结果:4 种

 解法与322类似,区别在于dp二维数组中,第一列的值要初始化为1,,记录的是有多少中凑法,

以第二行第4列为例:

1111
211 
22  

第一种凑法1111是上一行的的凑法,(一种),4 - 2 = 2, 使用面值2与第二列的凑法结合,2 和 11以及2 和 2,总共是上一行的凑法1加上这两种结果有3种,以此类推的到最终结果4

    public static void main(String[] args) {System.out.println(new L_518().dpChange(5, new int[]{1, 2, 5}));
//        System.out.println(new L_322().change(41, new int[]{25,10,5,1}));
//        System.out.println(new L_518().dpChange2(3, new int[]{2}));
//        System.out.println(new L_518().dpChange(1, new int[]{2}));
//        System.out.println(new L_518().dpChange(8, new int[]{5, 2, 1}));}/*** 求凑成 amount 值有多少中凑法(动态规划-完全背包问题)降维优化** @param amount* @param coins  硬币* @return 最少硬币数*/private int dpChange(int amount, int[] coins) {int[] dp = new int[amount + 1]; //缓存使用的硬币数//初始化第一列的值为 1dp[0] = 1;for (int coin : coins)for (int j = coin; j < amount + 1; j++) {dp[j] += dp[j - coin];}return dp[amount];}/*** 求凑成 amount 值的最少硬币数 (动态规划-完全背包问题)** @param amount* @param coins  硬币* @return 最少硬币数*/private int dpChange2(int amount, int[] coins) {int[][] dp = new int[coins.length][amount + 1]; //缓存使用的硬币数//初始化第一列的值为 1for (int i = 0; i < dp.length; i++) {dp[i][0] = 1;}//第一行,使用 1 硬币for (int j = 1; j < amount + 1; j++) {if (coins[0] <= j) { //能放下dp[0][j] = dp[0][j - coins[0]];}}for (int i = 1; i < coins.length; i++) {for (int j = 0; j < amount + 1; j++) {int upCnt = dp[i - 1][j];if (j >= coins[i]) {dp[i][j] = upCnt + dp[i][j - coins[i]];} else {dp[i][j] = upCnt;}}}print(dp);return dp[coins.length - 1][amount];}

降维优化:

    /*** 求凑成 amount 值有多少中凑法(动态规划-完全背包问题)降维优化** @param amount* @param coins  硬币* @return 最少硬币数*/private int dpChange(int amount, int[] coins) {int[] dp = new int[amount + 1]; //缓存使用的硬币数//初始化第一列的值为 1dp[0] = 1;for (int coin : coins)for (int j = coin; j < amount + 1; j++) {dp[j] += dp[j - coin];}return dp[amount];}

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

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

相关文章

算法-堆结构和堆排序

文章目录 本节大纲1. 堆结构2. 堆排序本节的代码实现合集 本节大纲 1. 堆结构 堆结构是为集合类里面的优先级队列来服务的 优先级队列其实就是顺序存储的二叉树结构, 我们的底层的源码里面是没有链式存储的二叉树的,二叉树的实现的细节是通过我们的数组来模拟实现的 底层的实现…

Python基础:Python中类型注解的详细介绍

Python 中的类型注解是 Python 3.5 引入的功能,主要用于提供关于变量、函数参数和函数返回值类型的额外信息。类型注解不影响 Python 程序的运行时行为,因为 Python 仍然是一种动态类型语言,注解不会强制类型检查。但它们对于代码维护、可读性、以及通过静态类型检查工具(如…

TFTP服务器

软件&#xff0c;客户端&#xff0c;服务器。是简单的文件传输文件。 1.TFTP服务器介绍 是简单的文件传输协议&#xff0c;是tcp/IP协议的一个用来在客户端与服务器之间进行简单文件传输的协议。端口号为69。每个服务器都有自己都端口号。 2.TFTP文件传输特点 3. 二:TFTP环境…

c++异常处理exception

// c中的异常处理 // 1.throw &#xff1a; 专门用于抛出异常&#xff0c;做出提示 // 2.try &#xff1a; 尝试运行可能会异常的代码 // 3.catch &#xff1a; 用于接收前面跑出来的异常并进行解决// 执行循序为: // try // { // throw ...; // 执行的代码中必须直接或者…

VRTK4教程 二:基本追踪

文章目录 untiyXR和UnityXRPluginFramwork使用方法&#xff1a; TrackedAlias使用方法使用技巧 untiyXR和UnityXRPluginFramwork 这两个用于跟踪头盔位置&#xff0c;其中UnityXR使用的是旧版API&#xff0c;另一个是新版API&#xff0c;两个我我们选一个即可 使用方法&#…

6.3 Go 结构体(Struct)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【计算机毕设】SpringBoot校园资料分享平台的设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的校园资料分享平台&#xff0c;以满足学生在学习过程中对资料分享和获取的需求。具体目标包括&#xff1a…

Java学习笔记 集合的使用

在实际的项目中开发过程中&#xff0c;会有很多的对象&#xff0c;如何高效、方便的管理这些对象&#xff0c;是影响程序性能与可维护性的重要环节。在Java语言中为这个问题提供了一套完美的解决方案&#xff0c;也就是接下来要介绍的集合框架。 1.1 集合框架的结构 从Collect…

都说美国去工业化了,那美国人都做什么工作啊?

美国&#xff0c;这个全球经济的重要参与者&#xff0c;经历了一场深刻的变革——去工业化。这一过程意味着&#xff0c;曾经以制造业为荣的美国&#xff0c;逐渐将重心转移到了其他领域。那么&#xff0c;美国人都做什么工作呢&#xff1f;让我们走近这位“经济体巨人”&#…

MySql 查询缓存

前言 MySQL的查询缓存&#xff08;Query Cache&#xff09;是一个在内存中存储SELECT语句及其结果集的机制&#xff0c;目的是避免对相同的查询进行重复的解析、编译和执行&#xff0c;从而提高数据库性能。 Mysql 结构图如下&#xff1a; 查询缓存的工作流程大致如下&#…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴

文章目录 &#x1f680;一、css基础知识⭐1. 认识css &#x1f308;二、选择器初级❤️id与class命名 &#x1f680;一、css基础知识 ⭐1. 认识css 概念 CSS(英文全称&#xff1a;Cascading Style Sheets)&#xff0c;层叠样式表。它是网页的装饰者&#xff0c;用来修饰各标签…

QT 使用信号和槽,让QLabel的内容实时与QLineEdit同步,类似vue框架的双向绑定

在窗口里放置一个单行文本编辑器&#xff08;QLineEdit&#xff09;和一个标签控件&#xff08;QLabel&#xff09;&#xff0c;实现的效果就是当编辑器的内容被编辑时&#xff0c;标 签控件同步显 示编辑控件里的内容 1&#xff09;当 lineEdit 控件被用户编辑时&#xff0c;它…

什么是大带宽独立服务器?

大带宽独立服务器指的是拥有较高网络带宽和独立的硬件设备的服务器。这种类型的服务器通常能够支持大量的访问流量和数据传输&#xff0c;适合于需要高性能和稳定运行的网站和应用程序。 对于许多企业和个人用户来说&#xff0c;选择合适的大带宽独立服务器提供商是相当重要的…

无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码

一、无人机模型介绍 无人机三维航迹规划_无人机航迹规划-CSDN博客 二、部分代码 close all clear clc warning (off) global model global gca1 gca2 gca3 gca4 model CreateModel(); % Create search map and parameters load(BestPosition5.mat); load(ConvergenceCurve5…

HTML布局

标准流&#xff1a; 标准流就是元素在页面中的默认排列方式&#xff0c;也就是元素在页面中的默认位置。 1.1 块元素----独占一行----从上到下排列 1.2 行内元素----不独占一行----从左到右排列&#xff0c;遇到边界换行 1.3 行内块元素----不独占一行…

四足机器人步态仿真(三)四足机器人基础步态仿真

观前提醒&#xff0c;本章主要内容为分析四足机器人步态实现和姿态控制&#xff0c;碰撞体积等程序 步态效果&#xff1a; 一、完整代码如下 # -*- coding: utf-8 -*-import pybullet as pimport timeimport numpy as npp.connect(p.GUI)p.createCollisionShape(p.GEOM_PLANE…

xLSTM: Extended Long Short-Term Memory

更多内容&#xff0c;请关注微信公众号&#xff1a;NLP分享汇 原文链接&#xff1a;xLSTM: Extended Long Short-Term Memory 论文链接&#xff1a;https://arxiv.org/pdf/2405.04517 为什么要在27年后提出新的LSTM呢&#xff1f; LSTM&#xff08;长短期记忆网络&#xff09…

Java 生成二维码底下带content

直接上代码&#xff1a;效果如下图 需引入 zxing生成二维码包 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.…

vue不同页面切换的方式(Vue动态组件)

v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…