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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
Python中正则表达式详解
May 17 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
python+pyqt5编写md5生成器
Mar 18 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
浅谈Python 函数式编程
Jun 20 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 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中的Streams工具
2015/07/03 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
Js动态创建div
2008/09/25 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
npm的lock机制解析
2019/06/20 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
在Python中操作字典之clear()方法的使用
2015/05/21 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
IRO美国官网:法国服装品牌
2018/03/06 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
澳大利亚商务邀请函
2014/01/17 职场文书
党建工作经验交流材料
2014/05/25 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
网吧温馨提示
2015/07/17 职场文书
Django实现翻页的示例代码
2021/05/24 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server