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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
跟老齐学Python之关于类的初步认识
Oct 11 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
利用Python开发实现简单的记事本
Nov 15 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
python实现txt文件格式转换为arff格式
May 31 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
python中shell执行知识点
May 06 Python
什么是Python包的循环导入
Sep 08 Python
详解python程序中的多任务
Sep 16 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 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将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
用Python解决x的n次方问题
2019/02/08 Python
python实现桌面气泡提示功能
2019/07/29 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
Java程序员面试题
2016/09/27 面试题
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
高二生物教学反思
2014/01/27 职场文书
公司保密承诺书
2014/03/27 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
英语教师求职信范文
2015/03/20 职场文书
放牛班的春天观后感
2015/06/01 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
服务器间如何实现文件共享
2022/05/20 Servers