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使用新浪微博API发送微博的例子
Apr 10 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
python2 与 python3 实现共存的方法
Jul 12 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python设置环境变量的作用整理
Feb 17 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
Python requests模块cookie实例解析
Apr 14 Python
Python之Sklearn使用入门教程
Feb 19 Python
Python实现为PDF去除水印的示例代码
Apr 03 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
jquery.validate使用攻略 第二部
2010/07/01 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
Python实现的检测网站挂马程序
2014/11/30 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
python得到windows自启动列表的方法
2018/10/14 Python
Python tkinter模版代码实例
2020/02/05 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
附答案的Java面试题
2012/11/19 面试题
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
人事经理岗位职责范本
2014/08/04 职场文书
质量承诺书格式范文
2015/04/28 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
js Proxy的原理详解
2021/05/25 Javascript
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android