当前位置: 首页 > news >正文

LeetCode 322 零钱兑换

题目: 给你一个整数数组 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

思路:

确定dp数组以及下标的含义
dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
确定递推公式
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],
那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])
所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。
递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
dp数组如何初始化
首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
确定遍历顺序
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
在代码中,if(dp[j - coins[i]] != INT_MAX)表示如果如果dp[j - coins[i]]是初始值则跳过
说明没有可以凑成j-conis[i]的结果
最后先判断dp[amount]是否为初始化的最大值,如果是,说明没有结果

class Solution {
public:int track(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);}}}return dp[amount];}
};int main() {vector<int> coins = { 1,2,5 };int amount = 11;Solution ss;cout<<ss.track(coins,amount)<<endl;return 0;
}
http://www.lryc.cn/news/69187.html

相关文章:

  • 面试篇SpringMVC是什么以及工作原理
  • jQuery-层级选择器
  • 【Java数据结构】——第十节(下).选择排序与堆排序
  • 45道SQL题目陆续更新
  • 在线PS软件有哪些不错的推荐
  • Java实现天气预报功能
  • python循环语句
  • 多线程基础(一)线程基础信息、synchronized 锁概念
  • JAVA期末考内容知识点的梳理
  • 为什么要使用Thrift与Protocol Buffers?
  • oa是什么意思?oa系统哪个好用?
  • Linq和C# Lambda表达式
  • 蓝桥:前端开发笔面必刷题——Day2 数组(三)
  • 人工智能专栏第四讲——人工智能的未来展望与机遇
  • Unity阴影(Shadow)、Shadowmap
  • 编程语言的四种错误处理方法,你知道几种?
  • ContOS7单机安装Hadoop
  • 抓取动态网页的数据的具体操作方法
  • Windows 和 Linux 环境下 ProtoBuf 的安装
  • 商用密码应用安全性测评方案编制流程
  • Elasticsearch 集群部署插件管理及副本分片概念介绍
  • Liunx 套接字编程(2)TCP接口通信程序
  • 8年开发经验,浅谈 API 管理
  • 【软考备战·四月模考】希赛网四月模考软件设计师上午题
  • MySQL中的@i:=@i+1用法详解
  • web安全第一天 ,域名,dns
  • 【Linux】Linux编辑神器vim的使用
  • vulnhub渗透测试靶场练习1
  • Uart,RS232,RS485串口通讯协议学习
  • UML中的assembly关系