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 相关文章推荐
PyQt 线程类 QThread使用详解
Jul 16 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
python绘制直方图和密度图的实例
Jul 08 Python
python批量解压zip文件的方法
Aug 20 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
python树的同构学习笔记
Sep 14 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
python机器学习库xgboost的使用
Jan 20 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 Python
Python的这些库,你知道多少?
Jun 09 Python
python前后端自定义分页器
Apr 13 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
php下通过POST还是GET来传值
2008/06/05 PHP
php获取淘宝分类id示例
2014/01/16 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python求列表交集的方法汇总
2014/11/10 Python
linux下python抓屏实现方法
2015/05/22 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python对象转换为json的方法步骤
2019/04/25 Python
Django实现内容缓存实例方法
2020/06/30 Python
python打包多类型文件的操作方法
2020/09/21 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
最好的商品表达自己:Cafepress
2019/09/04 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
Java软件工程师综合面试题笔试题
2013/09/08 面试题
建筑学推荐信
2013/11/03 职场文书
公司端午节活动方案
2014/02/04 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python