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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
快速了解Python中的装饰器
Jan 11 Python
python顺序执行多个py文件的方法
Jun 29 Python
Django Rest framework频率原理与限制
Jul 26 Python
python绘制雪景图
Dec 16 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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学习笔记之 函数声明(二)
2011/06/09 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
php实现用户登陆简单实例
2017/04/04 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
Python如何发布程序的详细教程
2018/10/09 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
python快排算法详解
2019/03/04 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
怎么快速自学python
2020/06/22 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
python中二分查找法的实现方法
2020/12/06 Python
Java的for语句中break, continue和return的区别
2013/12/19 面试题
采购员的工作职责
2013/12/26 职场文书
大学生志愿者感言
2014/01/15 职场文书
打架检讨书100字
2014/01/19 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
2015年小学开学寄语
2015/02/27 职场文书
小学教师工作总结2015
2015/04/07 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
未中标通知书
2015/04/17 职场文书
请假条应该怎么写?
2019/06/24 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库