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.listdir和os.walk获得文件的路径的方法
Dec 16 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
python实现按长宽比缩放图片
Jun 07 Python
Mac安装python3的方法步骤
Aug 09 Python
python应用文件读取与登录注册功能
Sep 23 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
python psutil监控进程实例
Dec 17 Python
Python脚本去除文件的只读性操作
Mar 05 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
python代码能做成软件吗
Jul 24 Python
python推导式的使用方法实例
Feb 28 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php session安全问题分析
2011/06/24 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
vue接口请求加密实例
2020/08/11 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
STP的判定过程
2012/10/01 面试题
大学生全国两会报告感想
2014/03/17 职场文书
三八妇女节标语
2014/10/09 职场文书
求职自我推荐信
2015/03/24 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
python爬虫--selenium模块
2021/03/31 Python
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电