当前位置:网站首页>力扣:322. 零钱兑换
力扣:322. 零钱兑换
2022-08-09 22:11:00 【empty__barrel】
力扣:322. 零钱兑换
题目:
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
dp【j】的含义:
dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
递推公式:
dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
初始化:
dp【0】为0的原因:amount是可以等于0的,同时按道理来讲很明显dp【0】 = 0
因为dp[j]选择的是二者中较小的那一个 = min(dp[j], dp[j-coins[i]]+1);所以下标非0的元素都是应该是最大值。
遍历顺序:
此题是完全背包类型,所以从小到大来 遍历,同时所求的是最少的硬币个数并没有涉及到序列,所以本题的两个for循环的嵌套无要求,谁先谁后都行。
递归函数前设置判断条件的原因:
因为dp[j] = min(dp[j], dp[j-coins[i]]+1);
这个操作假如dp[j - coins[i]] == INT_MAX
那么dp[j-coins[i]]+1
就越界了,所以要设置一个判断条件。
代码:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int>dp(amount+1,INT_MAX);
dp[0] = 0;
for(int i = 0; i < coins.size(); ++i){
for(int j = coins[i]; j <= amount; ++j){
if (dp[j - coins[i]] != INT_MAX) dp[j] = min(dp[j], dp[j-coins[i]]+1);
}
}
if(dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
边栏推荐
猜你喜欢
三:OpenCV图片颜色通道数据转换
Transfer Learning & Kemin Initialization
干货!迈向鲁棒的测试时间适应
迁移学习 & 凯明初始化
Bi Sheng Compiler Optimization: Lazy Code Motion
YGG 经理人杯总决赛已圆满结束,来看看这份文字版总结!
chart.js面积图曲线图统计插件
Good future, want to be a second new Oriental
Install win7 virtual machine in Vmware and related simple knowledge
【技术分享】SLA(服务等级协议)原理与配置
随机推荐
pip 离线到内网安装包
月薪5K的运维小白如何成为月薪5W的高级架构师?
Mysql集群 ShardingSphere
How to insist to use procedural system?
Interfering with BGP routing---community attributes
34. Fabric2.2 证书目录里各文件作用
shader学习笔记(五)
“我“是一名测试/开发程序员,小孙的内心独白......
OFDM 十六讲 7 - Inter-Symbol-Interference
后台管理实现导入导出
SRv6性能测量
Leetcode 98. 验证二叉搜索树
(转)字符集编码标识符,数字表示字符编码
对象深复制,面试题
leetcode:332. 重新安排行程
正则表达式的实际使用
Day 12 of learning to program
【燃】是时候展现真正的实力了!一文看懂2022华为开发者大赛技术亮点
三:OpenCV图片颜色通道数据转换
如何坚持使用程序化系统?