Leetcode 518 零钱兑换 II

题意理解

        给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

        请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

        将coins看作不同重量的背包,然后把要凑成的组合数看作背包容量。

        则该问题就是一个完全背包问题:

        即使用重量为coins的物品,每个物品有无数个,装满大小为amount的背包有多少种装法。

解题思路

        首先理解题意,将题目转换为完全背包问题。

        其中递归函数为:

        dp[j]表示凑满target有n种方式

        for(int i=0;i<coins.length;i++)

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

       关于遍历顺序:

        

1.遍历顺序问题

比如:amount=3  coins=[1,2]

先目硬币后目标值

public int change22(int amount, int[] coins) {//dp[target]数组表示,凑出target,有dp[target]种方法int[] dp=new int[amount+1];Arrays.fill(dp,0);dp[0]=1;for(int i=0;i<coins.length;i++){for(int target=0;target<=amount;target++){System.out.println("target:"+target);if(target>=coins[i]){System.out.print("硬币:"+coins[i]+"\t\t");dp[target]+=dp[target-coins[i]];}print(dp);}}return dp[amount];}

target:0
1    0    0    0    
target:1
硬币:1        1    1    0    0    
target:2
硬币:1        1    1    1    0    
target:3
硬币:1        1    1    1    1    
target:0
1    1    1    1    
target:1
1    1    1    1    
target:2
硬币:2        1    1    2    1    
target:3
硬币:2        1    1    2    2    
2

 其中,target=0时,有一种方式:没有一个硬币

target=1时,一种方式一个硬币   1

target=2时,两种方式:  1+1   2

target=3时,两种方式:   1+1+1    2+1|1+2

所以可以看出,这里先硬币后目标值,是组合数,所以1+2 和2+1 是同一个方式

先目标值后硬币

public int change(int amount, int[] coins) {//dp[target]数组表示,凑出target,有dp[target]种方法int[] dp=new int[amount+1];Arrays.fill(dp,0);dp[0]=1;for(int target=0;target<=amount;target++){System.out.println("target:"+target);for(int i=0;i<coins.length;i++){if(target>=coins[i]){System.out.print("硬币:"+coins[i]+"\t\t");dp[target]+=dp[target-coins[i]];}}print(dp);}return dp[amount];}

 target:0

1    0    0    0    
target:1
硬币:1        
1    1    0    0    
target:2
硬币:1        硬币:2        
1    1    2    0    
target:3
硬币:1        硬币:2        
1    1    2    3    
3

其中,凑出target=0,有一种方式:一个硬币也没有

凑出target=1,有一种方式:有一个硬币

凑出target=2有两种方式:  1+1    2

凑出target=3有三种方式:  1+1+1    2+1   1+2

所以可以得出,先目标值后硬币,是排序数,2+1 和1+2是两种方式

总结:

先硬币后目标值:组合数

先目标值后硬币:排序数

先遍历硬币,后遍历目标值,对于3来说

        dp[3]=dp[2]+dp[1]

        使用硬币1: 1+1+1   一种方式    dp[2]=1,当且仅当仅有硬币1的时候,凑成3有一种方式

        使用硬币2:  2+1      一种方式    dp[1]=1,当且仅当仅有硬币1和2的时候时,放入2,只有2+1一种方式凑成3        

先遍历目标值,后遍历硬币时,对于3来说:

        dp[3]=dp[2]+dp[1]

        dp[2]=2   其中:   1+1   2——>  1+1+1   2+1

        dp[1]=1   其中:   1        ——>1+2

 2.求解

 public int change(int amount, int[] coins) {//dp[target]数组表示,凑出target,有dp[target]种方法int[] dp=new int[amount+1];Arrays.fill(dp,0);dp[0]=1;for(int i=0;i<coins.length;i++){for(int target=0;target<=amount;target++){if(target>=coins[i]){dp[target]+=dp[target-coins[i]];}}}return dp[amount];}

3.分析

时间复杂度:

        O(n^2)

空间复杂度

        O(n)

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

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

相关文章

unity实现第一人称和第三人称

在角色设置两个挂载点&#xff0c;第一人称时&#xff0c;相机放在eys上面&#xff0c;切换第三人称时&#xff0c;放置到3rd节点上面&#xff0c;调整节点位置&#xff0c;达到期望效果 代码 void ThirdView(){Debug.Log("切换到第三人称");camera.SetParent(third…

C# Task的使用

C#中的Task类是.NET框架中用于实现异步编程的核心组件之一&#xff0c;它在.NET Framework 4及更高版本以及.NET Core中广泛使用。Task对象代表一个异步操作&#xff0c;并提供了跟踪异步操作状态、获取结果和处理完成通知的方法。 Task 类提供了对异步操作的封装&#xff0c;…

SaperaCamExpert(相机专家)中文使用指南

参考&#xff1a;SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing&#xff1a;预处理 Tools&#xff1a; 快捷键&#xff1a;新建&#xff1b;打开&#xff1b;保存&#xff1b;帮助Device窗体属性树图像…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…

莉莉与神奇花朵的冒险

现在&#xff0c;我将根据这些步骤编写一个对话形式的童话故事。 在很久很久以前的一个小村庄里&#xff0c;有一个勤劳善良的小女孩叫莉莉。她住在一间小茅屋里&#xff0c;和她的奶奶一起生活。奶奶年纪大了&#xff0c;行动不便&#xff0c;所以莉莉每天都要照顾她。 一天&a…

cpp智能指针篇(一):关于auto_ptr的一切

目录 写在前面 总览 智能指针的分类 为什么要使用智能指针&#xff1f; auto_ptr 致谢 写在前面 在过去几天中&#xff0c;我深入研究了智能指针的相关知识。这已经不是我第一次学习智能指针了&#xff0c;但这一次&#xff0c;我感觉自己真正理解了智能指针的工作原理。…

springboot war包部署 和jar包部署

文章目录 war包部署设置打包方式为war排除内嵌的tomcat在插件中指定入口类打包测试 jar包部署设置打包方式执行打包测试访问修改插件版本指定jsp打包配置 重新打包测试 war包部署 设置打包方式为war 执行项目打包的方式为 "war" 默认创建springboot项目打包都是ja…

vscode的ssh忽然连不上服务器:远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

vscode自动更新了一下就发现连不上服务器了&#xff0c;我寻思估计一大堆人都寄了&#xff0c;一搜&#xff0c;果然哈哈哈哈 然后我直接搜一天内新发布的博客&#xff0c;还真给我搜到了这个问题&#xff0c;按照这个问题里面的回答&#xff08;vscode1.86无法远程连接waitin…

TCP和UDP相关问题(重点)(2)

2.TCP和UDP的使用场景&#xff1f; UDP一般使用在传输数据的准确性要求不是特别高的场景&#xff0c;传输速度块。例如&#xff1a;视频通话&#xff0c;直播&#xff0c;语音。 TCP一般使用在对数据传输准确度特别高的场景&#xff0c;虽然速度慢一些&#xff0c;但也要保证数…

2024.2.6日总结(小程序开发3)

页面配置 页面配置和全局配置的关系&#xff1a; 小程序中&#xff0c;app.json中的window节点&#xff0c;可以全局配置小程序中每个页面的窗口表现 如果某些小程序想要有特殊的窗口表现&#xff0c;可以用页面级别的.json配置文件实现这个需求 页面配置和全局配置冲突时&…

Apache Kafka: 强大消息队列系统的介绍与使用

目录 引言 一、什么是Apache Kafka&#xff1f; 二、核心概念&#xff1a; 三、架构与工作原理&#xff1a; 四、使用实例&#xff1a; 五、优势与挑战&#xff1a; 六、结论&#xff1a; 引言 随着互联网技术的飞速发展&#xff0c;分布式系统变得越来越复杂&#xff0…

SpringBoot之整合PageHelper分页插件

SpringBoot之整合PageHelper分页插件 文章目录 SpringBoot之整合PageHelper分页插件1. 引入坐标2. application.yml配置3. 基本使用4. 对多个查询执行分页1. 默认第一个Select语句会执行分页2. 让Pagehelper也能执行多个分页的方法3. 完整案例 详细配置请查看官网或MyBatis分页…

程序员为什么不喜欢关电脑?

目录 标题&#xff1a;程序员为何乐见电脑长时间处于关闭状态&#xff1f; 引言&#xff1a; 一、思维的延续性&#xff1a; 二、环境的连续性&#xff1a; 三、长时间开机的原因&#xff1a; 四、恢复成本的考量&#xff1a; 结论&#xff1a; 特别的&#xff1a; 不是…

c++ 子进程交互 逻辑

目录 一、主进程逻辑 1、创建子进程时候,写入自己的HWND 2、响应子进程消息

亿某通电子文档安全管理系统 UploadFileToCatalog SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

leetcode | 杨辉三角 | 电话号码配对

电话号码的字母组合 class Solution {string _num[10] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};public:void Combinations(const string& di…

Python __file__属性:查看模块的源文件路径

除可以查看模块的帮助信息之外&#xff0c;还可以直接阅读模块的源代码来掌握模块功能&#xff0c;提升 Python 编程能力。 不管学习哪种编程语言&#xff0c;认真阅读那些优秀的框架、库的源代码都是非常好的学习方法。 通过模块的 __file__ 属性即可查看到指定模块的源文件…

防范恶意勒索攻击!亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件81起&#xff0c;事件数量有所下降&#xff0c;比上月降低20%。 lockbit3.0仍然是影响最严重的勒索家族&#xff1b;akira和incransom也是两个活动频繁的恶意家族&#xff0c;需要注意防范。 本周alphv勒索组织窃取MBC法律专业公司…

LangChain 最近发布的一个重要功能:LangGraph

LangGraph 是 LangChain 最近发布的一个重要功能&#xff0c;LangChain 进入多代理框架领域。通过建立在LangChain 之上&#xff0c;LangGraph 使开发人员可以轻松创建强大的代理运行时。 LangChain 使用其表达语言&#xff08;LCEL&#xff09;为开发人员构建定制链提供技术支…

MySQL之库操作和字符集

华子目录 MySQL库操作查看库创建数据库查看创建的数据库查看警告 删除数据库切换数据库显示当前数据库的变量值信息MySQL行格式行格式介绍显示行格式信息查看当前使用的数据库查看当前数据库版本查看当前用户查看所有用户查看MySQL支持的存储引擎显示当前数据库中所有表执行系统…