当前位置:网站首页>代码随想录笔记_动态规划_322零钱兑换
代码随想录笔记_动态规划_322零钱兑换
2022-08-08 13:07:00 【Erik_Won】
代码随想录笔记_动态规划
代码随想录二刷笔记记录
LC322.零钱兑换
题目
完全背包
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1
示例 2:
输入:coins = [2], amount = 3
输出:-1
示例 3:
输入:coins = [1], amount = 0
输出:0
思路分析
与 LC 528 不同,本题并不求组合数,而是求最少的硬币个数,因此,我们可知,本题对遍历顺序并无要求。
思路:
1.硬币有无限个
2.求凑成总金额最小硬币数
从条件1可知,本题是一个完全背包问题。
总金额 = 背包容量,硬币 = 物品, 每种硬币的数量无限:完全背包问题
动态规划五部曲
1.确定dp数组及其下标的含义
dp[j]:能组成总金额 j 的最少硬币个数
即:能装满背包的最少物品
2.确定递推公式
能推导出 dp[j] 的上一步为 dp[j - coin[i]]
凑成总金额 j - coin[i] 的最少硬币数量为 dp[j - coin[i]],此时加上一个coin[i],即 dp[j] = dp[j - coin[i]] + 1
由于 dp[j - coin[i]] 有很多个状态,因此,dp[j] 取所有dp[j - coin[i]] 中最小的。
递推公式:dp[j] = Min(dp[j], dp[j - coin[i]] + 1)
3.初始化
凑成总金额为 0 所需的 coin 个数为 0 ,因此 dp[0] = 0。而由于递推公式求最小值的特性,其他下标应初始化为最大值 Integer_Max , 否则,由于递推公式和 Min 函数的特点,会被初始值覆盖为0。
4.遍历顺序
本题先遍历背包或者物品都可以,没有特别要求
for(int i = 0;i < coins.length(); i++){
// 物品
for(int j = coins[i];j <= amount;j++){
// 背包
dp[j] = Min(dp[j],dp[j - coins[i]] + 1)
}
}
5.推演分析
以 coins[1,2,5] . amount = 5 为例
maxValue = Integer_Max
背包容量 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
物品 0 | 0 | min(maxValue,1) | (maxValue,2) | (maxValue,3) | (maxValue,4) | (mxValue,5) |
物品1 | 0 | 1 | (2,1) | (3,2) | (4,2) | (5,3) |
物品2 | 0 | 1 | 1 | 2 | 2 | (3,1) |
代码实现
完整代码实现
public static int coinChange(int[] coins, int amount) {
//初始化
int[] dp = new int[amount+1];
for (int i = 0;i < dp.length;i++){
dp[i] = Integer.MAX_VALUE;
}
//总金额为0时,硬币数目为0
dp[0] = 0;
//遍历顺序
for(int i = 0;i < coins.length;i++){
// 遍历物品
for(int j = coins[i];j <= amount;j++){
//遍历背包容量
// 如果上一个状态 dp [j - coin[i]] 为最大值,则代表状态没有变更过
// 因此这里也不需要变更
if(dp[j - coins[i]] != Integer.MAX_VALUE)
dp[j] = Math.min(dp[j],dp[j - coins[i]] + 1);
System.out.print(dp[j] + " ");
}
System.out.println();
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
边栏推荐
- (8)FlinkSQL自定义UDF
- win32&mfc————win32菜单栏&库
- Qt的简易日志库实现及封装
- 清华|GLM-130B:一个开放的双语预训练模型
- In-depth analysis of the soul of C language -- pointer
- 一文搞懂│XSS攻击、SQL注入、CSRF攻击、DDOS攻击、DNS劫持
- Jenkins - Introduction to Continuous Integration (1)
- OFD是什么
- R语言ggpubr包的ggsummarystats函数可视化分面箱图(通过ggfunc参数和facet.by参数设置)、添加描述性统计结果表格、palette参数配置不同水平可视化图像和统计值的颜色
- 难产的“第一股”:中式快餐之困
猜你喜欢
【C语言】动态内存管理
MySQl表的增删查改(CRUD)
南非 KMP 媒体集团实施了 DMS(文档管理系统)使流程数字化,员工可以再次专注于他们的实际任务,提供了效率
详解轮播图二-通过left定位来轮播图片
The use of string function, character function, memory function and its analog implementation
Collection of shell basics
指针和数组笔试题解析
nvm的使用 nodejs版本管理,解决用户名是汉字的问题
C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)
难产的“第一股”:中式快餐之困
随机推荐
Flink1.15源码阅读——StreamGraph流图
SAP数据迁移需要多久?
SQL INSERT INTO and INSERT INTO the SELECT statement
2022-08-03
【C语言】深度剖析数据在内存中的存储
The use of string function, character function, memory function and its analog implementation
"Huashu Cup" modeling learning (Matlab)
R语言patchwork包将多个ggplot2可视化结果组合起来、使用plot_annotation函数以及tag_level参数为组合图添加自定义编码序列(字符向量列表)
一名合格的程序员是如何优雅地解决线上问题的?
简析LDO静态电流与功耗的关系
SSL证书最长有效期13个月,还有必要一次申请多年吗?
R语言基于指定规则、条件删除列表中的元素:使用purrr包的discard函数移除列表数据中的NA值
MySQL:索引(1)原理与底层结构
【cookie 临时存储数据,WebStorage ,sessionStorage】
化工行业数字化供应链系统:赋能化工企业高质量发展,促进上下游协同
ctfshow 七夕杯(复现)
The maximum validity period of an SSL certificate is 13 months. Is it necessary to apply for multiple years at a time?
MySQl表的增删查改(CRUD)
【C语言】动态内存管理
PE文件-手工修改重定位表-WinHex-CFF Explorer