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函数中定义参数的四种方式
Nov 30 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python编程实现的图片识别功能示例
Aug 03 Python
对Python中gensim库word2vec的使用详解
May 08 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
keras用auc做metrics以及早停实例
Jul 02 Python
python em算法的实现
Oct 03 Python
python实现三壶谜题的示例详解
Nov 02 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读取zip文件的方法示例
2016/11/17 PHP
php中序列化与反序列化详解
2017/02/13 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python实现的ini文件操作类分享
2014/11/20 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
就业推荐自我鉴定
2013/10/06 职场文书
单位消防安全制度
2014/01/12 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
表扬通报怎么写
2015/01/16 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
Python入门之基础语法详解
2021/05/11 Python
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android