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
思路1:
深搜,找到所有可能的方案,再取最小的,这里可以适当的剪枝,如从cions[i]最大的开始搜。 时间复杂度O(2^n)。
思路2:
动态规划——dp[i]拼到最少需要的数量
这道题类似与上台阶问题的思路,状态转移方程:
dp[i] = max{ dp[i-cions[j]] } +1, j : 是coins中所有值
即问题相当于倒数,比如示例1中可以是dp[6] + 1(再来一张5元), dp[9] + 1(再来一张2元), dp[10]+1(再来一张1元).
class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""# 状态dp是凑成i需要的硬币数量# 本题的状态定义和状态转移和爬楼梯问题很类似dp = [amount+1 for i in range(amount+1)]# 初始值的设置!!!dp[0] = 0for m in range(1, amount+1):for j in range(len(coins)):if m-coins[j] >= 0:dp[m] = min(dp[m-coins[j]], dp[m])dp[m] += 1if dp[amount] <= amount:return dp[amount]else: #拼不出来!!!return -1
这里需要注意初始值的设置来保证最后返回的结果是正确的,因为有拼不出来的情况。
leetcode 322: 零钱兑换相关推荐
- leetcode: 322.零钱兑换
322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...
- LeetCode 322. 零钱兑换(DP)
文章目录 1. 题目信息 2. 解题 2.1 回溯穷举 2.2 动态规划 1. 题目信息 给定不同面额的硬币 coins 和一个总金额 amount. 编写一个函数来计算可以凑成总金额所需的最少的硬币 ...
- golang力扣leetcode 322.零钱兑换
322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...
- Java实现 LeetCode 322 零钱兑换
322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输 ...
- [LeetCode] 322.零钱兑换 五种方法讲解
322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...
- LeetCode 322. 零钱兑换
322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...
- Leetcode.322 零钱兑换
索引iii表示 amountamountamount 金额,dp[i]dp[i]dp[i] 表示最少 coinscoinscoins 个数. 递归 class Solution {int res = ...
- Leetcode 322.零钱兑换
Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...
- leetcode 322. 零钱兑换 思考分析
目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...
- 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)
步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...
最新文章
- 三次样条插值三弯矩matlab_三次样条(cubic spline)插值
- 哇赛!我是小龙女啊!
- Elasticsearch 技术分析(七): Elasticsearch 的性能优化
- jvm 参数_一文带你深入了解JVM内存模型与JVM参数详细配置
- nginx工作笔记004---配置https_ssl证书_视频服务器接口等
- c++ file* 句柄泄漏_C/C++连接MySql数据库使用总结
- 小白记事本--学不明白还怕忘记指针--loading未完待续
- JEECG框架自定义下拉框
- 短视频APP管理系统源码 直播系统源码
- 纯数学教程 Page 325 例LXVIII (4) 比值判别法和达朗贝尔判别法失效的一种情形...
- http301重定向IIS 301重定向域名转向新旧域名更替
- 名帖63 欧阳询 楷书《九成宫醴泉铭》
- 用Python 制作身高预测系统
- 网易云音乐评论墙php源码,网易云音乐热评墙那些令人感慨的句子,哪一句打动了你?...
- wl_15 Scanner使用
- 射频开关-RF Switch拆机
- 制作几个最简单的网页,需要学习HTML与CSS就好了,通过hbuilder写代码就好了,易迅达 精心推荐
- 使用element-tiptap后报错Duplicate use of selection JSON ID cell解决方法
- 牛客网“程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)”错误的可能原因
- javascript 对象{‘key1’:‘value1‘,‘key2‘:‘value2‘} 转化为数组 [{‘key1‘:‘value1‘},{‘key2‘:‘name2‘}]