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中使用SimpleParse模块进行解析的教程
Apr 11 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
Python基础中所出现的异常报错总结
Nov 19 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python做智能家居温湿度报警系统
Sep 25 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
Python面向对象程序设计示例小结
Jan 30 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
对Django中内置的User模型实例详解
Aug 16 Python
Python shutil模块用法实例分析
Oct 02 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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变量内存分配问题记录整理
2013/11/27 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
php工具型代码之印章抠图
2018/07/18 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
Python实现子类调用父类的方法
2014/11/10 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
python 列表降维的实例讲解
2018/06/28 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
如何写一封打动人心的求职信
2014/02/17 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
Java设计模式之代理模式
2022/04/22 Java/Android
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript