Python基于回溯法子集树模板解决找零问题示例


Posted in Python onSeptember 11, 2017

本文实例讲述了Python基于回溯法子集树模板解决找零问题。分享给大家供大家参考,具体如下:

问题

有面额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_num
  num = sum(x[:k+1])
  if 0 < best_num < num:
    return True
  return False # 无冲突
# 回溯法(递归版本)
def subsets(k): # 到达第k个元素
  global n, a, b, x, X, best_x, best_num
  if k == n: # 超出最尾的元素
    #print(x)
    X.append(x[:]) # 保存(一个解)
    # 计算硬币数目,若最佳,则保存
    num = sum(x)
    if best_num == 0 or best_num > num:
      best_num = num
      best_x = x[:]
  else:
    for i in range(b[k]+1): # 遍历元素 a[k] 的可供选择状态: 0, 1, 2, ..., b[k] 个硬币
      x[k] = i
      if not conflict(k): # 剪枝
        subsets(k+1)
# 测试
subsets(0)
print(best_x)

效果图

Python基于回溯法子集树模板解决找零问题示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 网络编程起步(Socket发送消息)
Sep 06 Python
Python里disconnect UDP套接字的方法
Apr 23 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
Python设计模式之代理模式实例详解
Jan 19 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
详解 Python 与文件对象共事的实例
Sep 11 #Python
Python 私有函数的实例详解
Sep 11 #Python
Python模拟用户登录验证
Sep 11 #Python
Python模拟三级菜单效果
Sep 11 #Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 #Python
Python 模拟购物车的实例讲解
Sep 11 #Python
python添加模块搜索路径方法
Sep 11 #Python
You might like
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
完美解决PHP中文乱码
2009/11/26 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python内建数据结构详解
2016/02/03 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
python实现点对点聊天程序
2018/07/28 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
毕业生个人求职的自我评价
2013/10/28 职场文书
小学庆六一活动总结
2014/08/28 职场文书
同学会邀请函模板
2015/01/30 职场文书
售票员岗位职责
2015/02/15 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Python if else条件语句形式详解
2022/03/24 Python