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使用os模块的os.walk遍历文件夹示例
Jan 27 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
python基本语法练习实例
Sep 19 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
Python道路车道线检测的实现
Jun 27 Python
Elasticsearch 聚合查询和排序
Apr 19 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数据库配置文件一般做法分享
2012/07/07 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
教你安装python Django(图文)
2013/11/04 Python
python实现实时监控文件的方法
2016/08/26 Python
Python中动态创建类实例的方法
2017/03/24 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
自我鉴定200字
2013/10/28 职场文书
五十岁生日宴会答谢词
2014/01/15 职场文书
主题酒店策划书
2014/01/28 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android