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中针对函数处理的特殊方法
Mar 06 Python
python实现调用其他python脚本的方法
Oct 05 Python
Python字符串匹配算法KMP实例
Jul 18 Python
python实现雨滴下落到地面效果
Jun 21 Python
Python实现图片拼接的代码
Jul 02 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
python pandas库的安装和创建
Jan 10 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
Python实现视频自动打码的示例代码
Apr 08 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使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
django实现前后台交互实例
2017/08/07 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
详解python中的lambda与sorted函数
2020/09/04 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
super关键字的用法
2012/04/10 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
Java servlet面试题
2012/03/04 面试题
竞聘书怎么写,如何写?
2014/03/31 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
安全生产宣传标语
2014/06/06 职场文书