零钱兑换

题目

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

示例 1:

输入: coins = [1, 2, 5], amount = 11

输出: 3

解释: 11 = 5 + 5 + 1

示例 2:

输入: coins = [2], amount = 3

输出: -1

说明:

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

解题思路

贪心算法 + DFS;

在本题当中,可以考虑先取最大面值的硬币(先对 coins 进行排序,由大到小),当取最大面值的硬币超出总额的时候,则取下一个稍微小的硬币;

当取硬币的时候,不一定要逐个取,用乘法代替加法。比如:times = amout // coins[index],这个式子就是计算最多可取多少个硬币。这里可能取到一种情况,就是由大到小取硬币的时候,可能前面的取的硬币导致后面无法凑出总额。遇到这种情况则考虑回溯减少前面取较大硬币的数量。

这里要考虑一些特殊的情况。coins = [1, 7, 10], amount = 14,按照上面的思路,这里优先得到的结果可能是 10, 1, 1, 1, 1,而不是最优的 7, 7,所以要将所有的情况递归完成。

上面的问题可以看出,贪心算法可能得到的不是最优解,但同样可以实现快速剪枝。

代码实现

class Solution:

def coinChange(self, coins: List[int], amount: int) -> int:

def coin_change(coins, amount, index, count, res):

if amount == 0:

return min(count, res)

if index == len(coins):

return res

# 这里用乘法代替加法,直接获得最多可取值

times = amount // coins[index]

while times >= 0 and count + times < res:

res = coin_change(coins, amount - times * coins[index], index + 1, count + times, res)

times -= 1

return res

if amount == 0:

return 0

coins.sort(reverse=True)

res = coin_change(coins, amount, 0, 0, float('inf'))

return res if res != float('inf') else -1

实现结果

以上就是使用贪心算法 + DFS 解决《零钱兑换》问题的主要内容。

欢迎关注微信公众号《书所集录》

python整钱兑换零钱_LeetCode 零钱兑换相关推荐

  1. python整钱换零钱_一知半解讲Python第二季:7.钞票兑换

    一道让我怀疑人生的题 CCF NOI1034 钞票兑换. 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 将任意给定的整百元钞票,兑换成10元.20元.50元小钞票形式.输出兑换 ...

  2. python整钱兑换零钱_使用Python完成收集变更的问题(DFS idea),凑,零钱,dfs,思想

    使用Python完成凑零钱问题(dfs思想) 题目描述 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手 ...

  3. python整钱兑换零钱while语句_关于python:如何将钱(便士)转换为单个硬币?

    我的任务是 "编写一个功能selectCoins,要求用户输入金额 (以便士为单位),然后输出每种面额的硬币数量(从£ 2向下 到1p)应该用来精确地补足该金额(使用尽可能少的 硬币数量). ...

  4. 整钱换零钱问题。把1元换成1分、2分、5分的硬币,共有多少种不同的换法(C语言)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验体验] 1.整钱换零钱问题.把1元换成1分.2分.5分的硬币,共有多少种不同的换法. 提示:设5分币个数为i(0-20) ...

  5. 完全背包问题Leecode322零钱兑换和Leecode518零钱兑换||

    文章目录 Leecode 322零钱兑换 Leecode 518零钱兑换II Leecode 322零钱兑换 题目大意 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ...

  6. 10元倍数的整钱换1元、2元、5元的零钱组合C语言

    将一面额为10元倍数的整钱(<=100元)换成1元.2元和5元的零钱组合(每种面值都要有).输入要换的面额(如10元),输出所有可能的换法及其数量.要求输出要依次按5元.2元.1元的数量从多到少 ...

  7. python汇率兑换双向_汇率兑换—python第一课

    一.人民币转换为美元 ''' 整段注释 功能:汇率兑换 版本:1.0 日期:18/02/06 ''' USD_VS_RMB = 6.77  #常量 #人民币输入,将字符串转换为数字 #变量 rmb_s ...

  8. python基础课程多少钱-培训python多少钱 ?

    现如今,随着人工智能的发展,Python真是越来越受欢迎了,已经有了超越其他编程语言的趋势.不少小伙伴想报个Python培训班学习python,却不知道培训python多少钱.下面我们就一起看看. 在 ...

  9. Java黑皮书课后题第3章:3.7(金融应用:整钱兑零)修改程序清单2-10,使之只显示非零的币值单位,用单词的单数形式显示一个单位,复数形式显示多于一个的单位的值

    3.7(金融应用:整钱兑零)修改程序清单2-10,使之只显示非零的币值单位,用单词的单数形式显示一个单位,复数形式显示多于一个的单位的值 题目 题目概述 程序清单2-10(非本题代码) 破题/思路:这 ...

最新文章

  1. 【华科考研机试题】阶乘
  2. IDEA集成Scala图文教程详细步骤
  3. 第三只眼使用局域网版本还是网络版好_iOS13.4测试版使用3天后,发现3个优化,建议升级!...
  4. Kubernetes入门--搭建Kubernetes集群,并启动容器服务
  5. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】
  6. 遗传算法中适值函数的标定与大变异算法
  7. 基于相关系数的影像匹配_论文推送 | 基于最优匹配算法的像控点电子点之记制作研究...
  8. 黑莓8330、8830写号,上网,输入法,汉化
  9. jsZip上传,jsZip压缩文件并上传到服务器
  10. 软件测试周刊(第54期):管他乐观还是悲观,都滚蛋,干就完了。
  11. h5 神策埋点_神策埋点
  12. 操作系统从MBR到加载内核的开机过程
  13. Caffe学习笔记二 Extracting Features
  14. python两个表格相同数据筛选_如何将多个表格中数据筛选汇总在一个表格里?
  15. 软件需求分析学习日记(一)需求工程概述
  16. leetcode 1859 又是一道字符串分隔的题目
  17. “顾客总是对的”,客户满意从在线客服系统开始
  18. 用BasicScrollBarUI实现一个简单的个性化滚动条皮肤
  19. 字体在其他浏览器正常在IE8显示字体模糊问题解决
  20. 简单高效的直播直播系统源码需要的服务器

热门文章

  1. Flutter 播放器插件
  2. SDNUOJ 1703.字谜|STL库中map的使用/map映射
  3. oracle中rollback命令,9.2.4 执行ROLLBACK命令
  4. NLTK 学习笔记(1)
  5. 专访星环CEO孙元浩:成国产基础软件第一股 解决卡脖子工程
  6. Asp.Net微信登录-手机网站APP应用
  7. 滑稽树下你和我Average distance(树形dp求任意两点距离之和)
  8. 计算机考研面试自我介绍范文英语,研究生复试英文自我介绍范文
  9. handler原子锁_OC的底层并发API
  10. Fortinet :《2021 年OT与网络安全现状报告》之「实践解读」