链接:https://leetcode-cn.com/problems/coin-change/

标签:动态规划、完全背包问题、广度优先搜索

题目

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

你可以认为每种硬币的数量是无限的。

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1 输入:coins = [2], amount = 3
输出:-1 输入:coins = [1], amount = 0
输出:0 输入:coins = [1], amount = 1
输出:1 输入:coins = [1], amount = 2
输出:2 1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

分析

此题和LeetCode第279题大致一样,可以参考这篇题解

可以使用BFS解决,也可以转换为完全背包问题解决。使用BFS解决的时候,注意选择合适的数据结构进行剪枝。具体的方法不再赘述,可以看上面的题解。

编码

BFS + 剪枝

class Solution {
public int coinChange(int[] coins, int amount) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(amount);
int length = coins.length, res = 0;
boolean[] visited = new boolean[amount + 1]; while (!queue.isEmpty()) {
int len = queue.size();
for (int j = 0; j < len; j++) {
int num = queue.poll();
if (num == 0) {
return res;
} for (int i = 0; i < length; i++) {
if (num >= coins[i] && !visited[num - coins[i]]) {
visited[num - coins[i]] = true;
queue.offer(num - coins[i]);
}
}
}
res++;
} return -1;
}
}

DP:

class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0; for (int i = 1; i <= amount; i++) {
for (int num : coins) {
if (i >= num) {
dp[i] = Math.min(dp[i - num] + 1, dp[i]);
}
}
} return dp[amount] == (amount + 1) ? -1 : dp[amount];
}
}

LeetCode:322. 零钱兑换的更多相关文章

  1. Java实现 LeetCode 322 零钱兑换

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

  2. Leetcode 322.零钱兑换

    零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: co ...

  3. leetcode 322零钱兑换

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  4. [LeetCode]322. 零钱兑换(DP)

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

  5. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

  6. Leetcode 518.零钱兑换II

    零钱兑换II 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币有无限个. 注意: 你可以假设 0 <= amount (总金额) <= 500 ...

  7. Java实现 LeetCode 518 零钱兑换 II

    518. 零钱兑换 II 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币有无限个. 示例 1: 输入: amount = 5, coins = [1, ...

  8. Leetcode题目322.零钱兑换(动态规划-中等)

    题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...

  9. [Leetcode][动态规划] 零钱兑换

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

随机推荐

  1. CTF密码学常见加解密总结

    CTF密码学常见加解密总结 2018年03月10日 19:35:06 adversity` 本文链接:https://blog.csdn.net/qq_40836553/article/details ...

  2. XCTF-ics-04

    ics-04 题目描述 工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag. 解题过程 拿dirsearch扫一波,没有什么有用的东西 注册个账号,登陆被提示普通用户登录成功,没什么用 登陆 ...

  3. 通过 Netty、ZooKeeper 手撸一个 RPC 服务

    说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...

  4. 【maven】IDEA工程右边的maven配置中Plugins有重复的命令

    问题 解决 换一个IDEA的版本,比如2020.02 参考链接 https://ask.csdn.net/questions/1060938 https://bbs.csdn.net/topics/3 ...

  5. IT培训软件测试怎么样,问问“过来人”!

    经常看到有人在网上发帖子问:"XX培训(IT培训机构)怎么样,学过的老哥可以出来讲讲真话吗?"问这种问题的同学,来,站起来!我不得不在这儿说你两句:你要想知道一家IT培训机构到底怎 ...

  6. 并发容器-CopyOnWriteArrayList

    并发容器一览 图源:https://time.geekbang.org/column/article/90201?utm_term=pc_interstitial_938 CopyOnWriteArr ...

  7. .Net Core导入千万级数据至Mysql

    ​最近在工作中,涉及到一个数据迁移功能,从一个txt文本文件导入到MySQL功能. 数据迁移,在互联网企业可以说经常碰到,而且涉及到千万级.亿级的数据量是很常见的.大数据量迁移,这里面就涉及到一个问题 ...

  8. 『动善时』JMeter基础 — 16、JMeter配置元件【HTTP信息头管理器】

    目录 1.用于演示的项目说明 2.测试计划内包含的元件 3.HTTP请求界面内容 4.查看脚本执行结果 5.添加请求头信息(HTTP信息头管理器) 6.优先级说明 7.补充:常见请求头信息 JMete ...

  9. makefile的include用法

    include 使用方法 : include filename.mk 作用: 暂停当前的makefile执行,去执行指定的makefile,执行完毕后继续执行当前的makefile -include ...

  10. jmeter自动停止监听--AutoStop Listener

    如下图: