问题

有面额10元、5元、2元、1元的硬币,数量分别为3个、5个、7个、12个。现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解。

分析

元素——状态空间分析大法:四种面额的硬币看作4个元素,对应的数目看作各自的状态空间,遍历状态空间,其它的事情交给剪枝函数。

解的长度固定:4

解的编码:(x1,x2,x3,x4) 其中x1∈[0,1,2,3], x2∈[0,1,2,3,4,5], x3∈[0,1,2,...,7], x4∈[0,1,2,...,12]

求最优解,增添全局变量:best_x, best_num

套用回溯法子集树模板。

代码


'''找零问题'''n = 4
a = [10, 5, 2, 1] # 四种面额
b = [3, 5, 7, 12]  # 对应的硬币数目(状态空间)m = 53  # 给定的金额x = [0]*n   # 一个解(n元0-b[k]数组)
X = []   # 一组解best_x = []  # 最佳解
best_num = 0 # 最少硬币数目# 冲突检测
def conflict(k):global n,m, x, X, a, b, best_num# 部分解的金额已超if sum([p*q for p,q in  zip(a[:k+1], x[:k+1])]) > m:return True# 部分解的金额加上剩下的所有金额不够if sum([p*q for p,q in  zip(a[:k+1], x[:k+1])]) + sum([p*q for p,q in  zip(a[k+1:], b[k+1:])]) < m:return True# 部分解的硬币个数超best_numnum = sum(x[:k+1])if 0 < best_num < num:return Truereturn False # 无冲突# 回溯法(递归版本)
def subsets(k): # 到达第k个元素global n, a, b, x, X, best_x, best_numif k == n:  # 超出最尾的元素#print(x)X.append(x[:]) # 保存(一个解)# 计算硬币数目,若最佳,则保存num = sum(x)if best_num == 0 or best_num > num:best_num = numbest_x = x[:]else:for i in range(b[k]+1): # 遍历元素 a[k] 的可供选择状态: 0, 1, 2, ..., b[k] 个硬币x[k] = iif not conflict(k): # 剪枝subsets(k+1)# 测试
subsets(0)
print(best_x)

效果图

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/6959450.html,如需转载请自行联系原作者

python 回溯法 子集树模板 系列 —— 17、找零问题相关推荐

  1. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  2. python 回溯法 子集树模板 系列 —— 1、8 皇后问题

    问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...

  3. python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...

  4. python 回溯法 子集树模板

    回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足 ...

  5. python回溯算法全排列_python 回溯法 子集树模板 系列 —— 11、全排列

    问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模板. 不过本文使用子集树模板.分析如下: 一个解x就是n个元素的一种排列,显然,解x的长度是固定 ...

  6. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例

    本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...

  7. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  8. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

  9. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

    本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...

  10. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

最新文章

  1. 验证码的产生 python
  2. GridSearchCV和RandomizedSearchCV调参
  3. SAP Fiori:why my filter by titleID does not work
  4. SpringBoot+Thyemleaf报错Template might not exist or might not be accessible
  5. python处理时间的标准数据_python数据分析数据标准化及离散化详解
  6. PostgresSQL模式
  7. maven 部署及使用
  8. [C] static和extern的作用
  9. Office 2019 正式版 下載
  10. sprintf和fprintf
  11. python爬取pdf教程_#如何利用Python抓取PDF中的某些内容#python爬取pdf教程
  12. 第一章,实现数据完整性
  13. Java毕设_装修公司业务流程管理系统的设计与实现
  14. Python爬虫 - 抓取divnil动漫妹子图
  15. 白杨SEO:百度上收录高的平台有哪些?如何找到和使用它们实战举例【干货】
  16. Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?
  17. 海外代购系统/代购网站怎么搭建——源码解析
  18. 工厂3d模拟展示虚拟漫游彰显企业实力和竞争力
  19. 员工激励的一般原则和方法
  20. 如何使用微信开发者工具调试前后端接口

热门文章

  1. 月薪30K大佬源码阅读的经验总结,干货不容错过
  2. 面试鹅厂,我被虐的体无完肤。。。
  3. 扫地机器人 杂牌_国内扫地机器人哪个牌子好?
  4. linux eof打印列表,Linux:结合cat和EOF输出到文本文件
  5. java编码规范概述_Java 编码规范 (转)
  6. junit 生成html报告,gradle – 如何为JUnit 5测试创建HTML报告?
  7. php 监听模式,总结Laravel事件系统用法(监听事件,观察者模式)
  8. linux攻防比赛_LINUX 遭到SYN FLOOD攻击 LINUX下SYN攻防战
  9. asp打开exe执行本地程序._ASP.NET Core Web实现Windows 服务功能
  10. esxi 需要整合 空间不足_太炫酷了!10月微信新花样!微信情侣空间怎么设置如何弄微信情侣空间在哪里开...