算法:动态规划

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、问题描述

二、动态规划算法

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

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

输入: coins = [2], amount = 3
输出: -1

二、动态规划算法

解题思路:

当我们拿到这个题目的时候,第一时间是想,总金额有多少种组合方式,然后再结合硬币金额进行匹配,但是这个方法可能性太多了,比较复杂。

换一种思路,不如我们先从1到amount,然后将每一个值需要的最少硬币数算好,然后逐步向最后的值靠拢

就拿这个例子来说:

先看1,刚好有1元硬币,最少硬币数是1

再看2,刚好有2元硬币,最少硬币数是1

再看3,比3小的硬币有两种,一种是1元,一种是2元,我们优先用2元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是2

再看4,比4小的硬币有两种,一种是1元,一种是2元,我们优先用2元的,还剩2元,那么我们找一下2元需要的最少硬币数,是不是第二步已经算出来了,1枚,加起来就是2

再看5,小于等于5的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩0元,最少硬币数是1

再看6,小于等于6的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是2

......

最后看11,小于等于11的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩6元,6元大于三种硬币最大的面值,那么再用一枚5元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是3

这个分析的过程太香了!!!

代码示例:

public int coinChange(int[] coins, int amount) {// 初始化动态规划数组,长度为amount+1,初始值为amount+1,表示无法凑成该金额int[] dp = new int[amount + 1];for (int i = 0; i <= amount; i++) {dp[i] = amount + 1;}// 凑成金额0所需的硬币个数为0dp[0] = 0;// 遍历所有金额,更新dp数组for (int i = 1; i <= amount; i++) {// 遍历所有面额的硬币for (int j = 0; j < coins.length; j++) {// 如果当前金额大于等于当前面额的硬币,尝试使用该硬币if (i >= coins[j]) {// 更新dp数组,取最小值dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}}// 如果dp[amount]仍为amount+1,表示无法凑成总金额,返回-1return dp[amount] > amount ? -1 : dp[amount];
}
  1. 初始化一个长度为总金额+1的数组dp,初始值都设为总金额+1,表示无法凑成该金额。dp[i]表示凑成金额i所需的最少硬币个数。

  2. 将dp[0]设为0,因为凑成金额0不需要任何硬币。

  3. 遍历所有金额,从1到总金额。对于每个金额i,遍历所有硬币面额,如果当前金额大于等于当前面额的硬币,尝试使用该硬币。

  4. 更新dp[i]的值,取dp[i]和dp[i-coins[j]]+1的最小值。dp[i-coins[j]]+1表示使用当前面额的硬币后,剩余金额需要的最少硬币个数。

  5. 遍历完所有金额后,如果dp[amount]仍为总金额+1,表示无法凑成总金额,返回-1。否则,返回dp[amount],即凑成总金额所需的最少硬币个数。


总结

注释已添加,快快动手练习吧,简单到有手就行!

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

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

相关文章

LeetCode 26 删除有序数组中的重复项

题目描述 找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&…

minio服务数据迁移-rclone迁移工具

一、背景&#xff1a; 在生产运行过程中经常有遇见数据迁移的工作&#xff0c;这里介绍了如何进行minio服务的数据迁移过程。 二、迁移思路&#xff1a; minio服务/集群的数据迁移思路是需要新建一个配置、密码一样的minio服务/集群&#xff1b;在中间服务器上安装rclone工具&a…

atoi函数的模拟实现

这里强力推荐一篇文章 http://t.csdnimg.cn/kWuAm 详细解析了atoi函数以及其模拟实现&#xff0c;我这里就不说了。 这里作者先把自己模拟的代码给大家看一下。 int add(char* arr) {char* arr2 arr;while (*arr!-48){arr;}arr--;int sum 0;int n 0;while (arr ! (arr2-…

如何构建高效测试体系?掌握5大自动化测试模式就够了

软件开发过程中&#xff0c;高效的自动化测试体系是提升测试效率、保证产品质量关键&#xff0c;一个全面的测试体系涵盖多个维度&#xff0c;从功能性到用户界面&#xff0c;再到性能和安全性。 每个维度均采用不同的测试模式来满足特定的需求和解决特别的挑战&#xff0c;本…

快速打通 Vue 3(三):Vue3 中的 watch 监听器与新特性

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

风向再生变!智能汽车「竞合」博弈升级

新一轮科技革命影响下&#xff0c;全球汽车产业产品形态和格局被重塑&#xff0c;深度变革也随之而至。 高工智能汽车研究院监测数据显示&#xff0c;中国智能电动市场渗透率从2018年的0.32%&#xff08;占全部新能源车交付量&#xff09;快速提升至2022年的41.84%&#xff1b…

精选免费API接口汇总

笑话大全&#xff1a;各种最新、最及时的幽默、搞笑段子&#xff0c;不间断更新。历史上的今天&#xff1a;看看历史上的今天&#xff0c;都发生了什么重大事件。周公解梦 &#xff1a;周公解梦大全,周公解梦查询&#xff0c;免费周公解梦。标准体重计算器&#xff1a;身体质量…

为什么国产操作系统是基于linux研发的呢?

为什么国产操作系统是基于linux研发的呢&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

2023年AIGC发展回顾与展望

2023年是人工智能内容生成&#xff08;AIGC&#xff09;技术飞速发展的一年。从年初ChatGPT一炮打响&#xff0c;大家纷纷加入到大模型研究之中。期间Midjourney和Stable Diffusion AI绘画技术持续火热&#xff0c;基于AIGC类的应用也如雨后春笋般遍地开花。万众瞩目的OpenAI G…

SpringCloud Feign-声明性Http请求以及Hystrix-Http请求的熔断配置

1、OpenFeign 1.1 概述 – Feign是一个声明性web服务客户机。它使编写web服务客户机变得更容易。 – 它的使用方法是定义一个服务接口并在上面添加注解。 – Feign支持可插拔编码器和解码器。 – Spring Cloud对Feign进行了封装&#xff0c;使其支持SpringMVC标准注解和Httpttp…

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据&#xff08;2&#xff09; 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】&#xff1a; 通常来讲大数据&#xff08;Big Data&am…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上&#xff0c;在服务器上执行脚本时&#xff0c;脚本中的 nohup 命令无法执行&#xff0c;并不生效&#xff0c;我配置的Exec command命令是后台启动一个war包&#xff0c;并输出日志文件。 nohup java -jar /…

MySQL数据库连接超时和自动重连

1、当我们连接一个数据库的时候&#xff0c;当ip是错的&#xff0c;但是他还是很耗时间的&#xff0c;大概30s之后才会通知连接失败&#xff0c;该操作是十分费时的 所以可以使用 //&是你自己初始化的数据库名字 //&time3表示3秒连接不上&#xff0c;直接报错 int ti…

批量美化图片:让您的图片库焕然一新!

您是否曾经遇到过这样的问题&#xff1a;在处理大量图片时&#xff0c;一张一张地调整时间和精力成本太高&#xff1f;现在&#xff0c;我们为您带来了一款全新的批量图片美化工具&#xff0c;让您轻松解决这个问题&#xff01; 首先&#xff0c; 我们要进入首助编辑高手主页面…

(每日持续更新)jdk api之BufferedReader基础

&#xff08;每日持续更新&#xff09;jdk api之BufferedReader基础 1.8 BufferedReader BufferedReader 是 Java 中 Reader 的缓冲流实现&#xff0c;用于提高读取字符数据的性能。它提供了一些额外的属性和方法&#xff0c;以增强对字符流的操作。 以下是 BufferedReader …

/etc/profile文件一不小心改坏了,所有命令无法执行了怎么办?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 在部署jdk的时候&#xff0c;修改/etc/profile文件&#xff0c;文件改得有问题&#xff0c;但是当时没有…

【二】CocosCreator-CCGame.js源码分析

PS&#xff1a;只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。 【1】config&#xff1a;当前游戏的一些配置 1.debugMode&#xff1a;用于控制输出日志的级别 2.showFPS&#xff1a;是否显示FPS 3.exposeClassName 4.frameRate&#xff1a;设置游戏帧率 5.id 6.…

redis单机部署

一、下载redis压缩包tar.gz 官网下载&#xff0c;现在一般用6.x以上版本 二、上传指定目录&#xff0c;解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录&#xff0c;进行编译 cd redis-6.2.14 make &&a…

SSH以及Dropbear介绍

SSH 1、什么是SSH (1)SSH仅仅是一种协议标准&#xff0c;目的是实现安全远程登录及安全网络服务。 2、实现SSH的工具有哪些 (1)开源OpenSSH&#xff0c;使用最广泛。 (2)Dropbear&#xff0c;轻量级SSH。 3、SSH可以实现的功能场景 (1)安全远程登录 (2)安全的端口转发 ①本地端…