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 正则式 概述及常用字符
May 07 Python
python错误处理详解
Sep 28 Python
Python中转换角度为弧度的radians()方法
May 18 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
Python单链表原理与实现方法详解
Feb 22 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
详细介绍python类及类的用法
May 31 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学习 变量使用总结
2011/03/24 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP强制转化的形式整理
2020/05/22 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
js简单抽奖代码
2015/01/16 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
python异常和文件处理机制详解
2016/07/19 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python SQLite3简介
2018/02/22 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
药学专业大学生个人的自我评价
2013/11/04 职场文书
大学毕业感言200字
2014/03/09 职场文书
主持词开场白
2014/03/17 职场文书
广播节目策划方案
2014/05/23 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
如何拟写通知正文?
2019/04/02 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技