从自动贩卖机找零看Python中的动态规划问题

2023-11-09

原文:http://www.jianshu.com/p/144db81341a3

从自动贩卖机找零看Python中的动态规划问题

问题描述

假设在某国存在[1,x1,x2,x3,...,xn]多种货币,该国的自动贩卖机在找零时要遵循一个原则——“找零的总张数最少”。那么,该如何编写程序,帮助自动贩卖机自动找零呢?

问题分析

解决这一问题的最直接思路是穷举法。假设需要找零Y元,那么就通过所有的小于Y的货币,列举出找零的所有方案,进而比较哪个总张数最少。这种思路需要在计算中蕴含有大量的重复,时间复杂度极大。
类似问题的一个有效解法是使用动态规划的思想来处理。

求解找零所需要最少货币数

以面值为1,5,10,25的货币为例:


解决这一问题的关键在于,利用类似的等式,不断缩小问题的规模。当问题缩小为“需要多少张货币来找0元”时,问题的答案显然是0。
我们需要额外做的就是创建一个列表,用以保存比要计算的找零需求更小的需求。

# need_change 为需要找零的金额,
# currency_list 为该国货币的面值列表,
# num_list 为需要找零的最少货币数目, num_list的长度至少为(need_change+1)
def giveChange(need_change, currency_list, num_list):
    for change in range(need_change+1): #从0开始计算最少需要的货币数
        for currency in currency_list: #遍历每一种货币
            if (change-currency >= 0) and (num_list[change-currency]+1<num_list[change]): #计算最少货币需求数
                num_list[change] = num_list[change-currency] + 1
    return

def main():
    need_change = 63
    currency_list = [1,5,10,21,25]
    num_list = list(range(need_change+1)) #初始化num_list为0到need_change,共(need_change+1)个数
    giveChange(need_change, currency_list, num_list)
    print("%d 需要 %d 个货币来找零"%(need_change, num_list[need_change]))
if __name__ == "__main__":
    main()

运行结果为:

63 需要 3 个货币来找零

仅仅输出了正确的货币数目是不够的,我们还需要输出具体是哪些面值的货币。

自动找零问题的解决

如同常见的,最短路径的记录一样。为输出具体是需要找哪些面值的货币的零钱,我们需要再上一步骤的基础上记录下每步求解最小化使用的货币。
为此,我们需要在添加一个列表,用以记录这个数值。

# need_change 为需要找零的金额,
# currency_list 为该国货币的面值列表,
# num_list 为需要找零的最少货币数目, num_list的长度至少为(need_change+1)
# used_list 为需要找零的最少货币数目, 长度与num_list相同
def giveChange(need_change, currency_list, num_list, used_list):
    for change in range(need_change+1): #从0开始计算最少需要的货币数
        for currency in currency_list: #遍历每一种货币
            if (change-currency >= 0) and (num_list[change-currency]+1<=num_list[change]): #计算最少货币需求数
                num_list[change] = num_list[change-currency] + 1
                used_list[change] = currency #记录消耗的货币
    return

# 返回需要的货币
def showChange(need_change, used_list):
    give_list = []
    while need_change > 0:
        give_list.append(used_list[need_change])
        need_change -= used_list[need_change]
    give_list.sort() #排序
    return give_list

def main():
    need_change = 64 #需要找零的钱数
    currency_list = [1,5,10,21,25] # 该国的货币面值列表
    num_list = list(range(need_change+1)) #初始化num_list为0到need_change,共(need_change+1)个数
    used_list = list(range(need_change+1)) #初始化used_list为0到need_change,共(need_change+1)个数
    giveChange(need_change, currency_list, num_list, used_list)
    print("%d 需要 %d 个货币来找零"%(need_change, num_list[need_change]))
    give_list = showChange(need_change, used_list)
    print(give_list)

if __name__ == "__main__":
    main()

计算结果为:

64 需要 4 个货币来找零
[1, 21, 21, 21]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从自动贩卖机找零看Python中的动态规划问题 的相关文章

  • python opencv 在线读取网络图片图像资源

    opencv在线读取网络图片图像资源 照例打开opencv3 3 0 python3 6官方文档 https docs opencv org master d8 dfe classcv 1 1VideoCapture html 详解 官方文
  • 海森矩阵及其应用

    海森矩阵及其应用 转载 2017年04月20日 09 59 48 标签 梯度下降算法 微积分 牛顿迭代法 原文参考链接 here 原文讲得到很详细 海森矩阵 在数学中 海森矩阵 Hessian matrix或Hessian 是一个自变量为向
  • bat面试题 python 单链表反转排序

    单链表反转python实现 单链表的反转可以使用循环 也可以使用递归的方式 1 循环反转单链表
  • python 文件查找性能对比 python与powershell

    目录 6万行的文本文件 python遍历查找和powerchell 查找方式对比 代码 结论
  • scikit-learn kmeans++

    聚类分析在客户细分中极为重要 有三类比较常见的聚类模型 K mean聚类 层次 系统 聚类 最大期望EM算法 在聚类模型建立过程中 一个比较关键的问题是如何评价聚类结果如何 会用一些指标来评价 原文 http blog csdn net s
  • 深度学习入门资料整理

    深度学习基础总结 无一句废话 附完整思维导图 深度学习如何入门 知乎 深度学习入门基础讲义 shuzfan的博客 CSDN博客 深度学习入门 神经网络15分钟入门 足够通俗易懂了吧 知乎 深度学习基础知识点梳理 知乎
  • python学习3. 无重复字符的最长子串(滑动窗口)

    makcooo 2019 04 19 15 47 32 271 收藏 分类专栏 python 版权 给定一个字符串 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 abcabcbb 输出 3 解释 因为无重复字符的最长子串是
  • 图像掩膜的作用

    用选定的图像 图形或物体 对待处理的图像 全部或局部 进行遮挡 来控制图像处理的区域或处理过程 用于覆盖的特定图像或物体称为掩模或模板 光学图像处理中 掩模可以足胶片 滤光片等 数字图像处理中 掩模为二维矩阵数组 有时也用多值图像 数字图像
  • 浏览器手势识别原理

    以下内容转自 链接 https www zhihu com question 20607813 answer 1396981185 来源 知乎 Stroke 是作者的一款开源鼠标手势 支持复杂手势 对于这个问题 我觉得可以细分为这样两个子问
  • 总结一下遇到的各种核函数

    原文 http www bubuko com infodetail 991698 html 首先 再对核方法的思想进行描述 核函数的思想是一个伟大的想法 它工作简练巧妙的映射 解决了高维空间中数据量庞大的问题 在机器学习中是对算法进行非线性
  • 突破对银河系的传统认知 大量超高能宇宙加速器被发现

    宇宙无限 信使有痕 5月17日 国家重大科技基础设施 高海拔宇宙线观测站 LHAASO 公布在银河系内发现大量超高能宇宙加速器 并记录到能量达1 4拍电子伏的伽马光子 拍 千万亿 这是人类观测到的最高能量光子 突破了人类对银河系粒子加速的传
  • 最速曲线及应用

    一起来观赏一下数学之骚美 原文 https tieba baidu com p 3635683462 red tag 0223460281 这事儿和17世纪的一道谜题有关 直到后来微积分被建立起来以后才得正解 虽然问题不难 但结果惊艳 我先
  • 神经网络的几点思考

    2022 04 09 1 小卷积核和大卷积核有没有可能组合使用效果更好 比如在目标检测网络 人脸识别网络 2 人脸识别中共享卷积有效吗 共享卷积和局部卷积有没有可能组合使用效果会更好 人脸识别 人脸属性 人脸关键点 活体检测应该都可以用局部
  • python opencv键盘监听

    目录 读取图片监听 opencv pyinput 监听小键盘 读取图片监听 for file in files a cv2 imread path file cv2 imshow a a k cv2 waitKey 10 0xFF if k
  • pww区域连接特征提取算法

    主题思想 任何一个图像 肯定由多个或一个区域 每个区域在横向扫描时 会有分裂和合并 比如圆环 顶部有一个分裂点 底部有一个合并点 没有分裂合并的图形 就是简单的凸图像 很容易通过外形识别 而复杂的图像 就是凹的 就需要分裂合并点来识别 旋转
  • 遗传算法入门到掌握(一)

    遗传算法入门到掌握 一 心得 把解决方案做染色体 遗传算法的有趣应用很多 诸如寻路问题 8数码问题 囚犯困境 动作控制 找圆心问题 这是一个国外网友的建议 在一个不规则的多边形 中 寻找一个包含在该多边形内的最大圆圈的圆心 TSP问题 在以
  • 机器学习(一)——K-近邻(KNN)算法

    机器学习 一 K 近邻 KNN 算法 最近在看 机器学习实战 这本书 因为自己本身很想深入的了解机器学习算法 加之想学python 就在朋友的推荐之下选择了这本书进行学习 一 K 近邻算法 KNN 概述 最简单最初级的分类器是将全部的训练数
  • opencv图像灰度重心算法

    原文 http blog csdn net moses1213 article details 44679603 导师交给的项目 其中一步就是求光斑的重心 网上有很多关于重心的代码 大体是利用cvFindContour函数找出图像的轮廓 然
  • Python机器学习(三)--决策树算法

    Python机器学习 三 决策树算法 原创 2014年07月14日 13 57 55
  • 黑白图片上色算法

    效果图 Marked B W image Result Marked B W image Result Marked B W image Result Marked B W i

随机推荐

  • 【R语言】——火山图绘制

    本期介绍利用R语言筛选差异表达基因及绘制火山图 一 什么是火山图 火山图 volcano plot 是散点图的一种 它将统计测试中的统计显著性量度 如p value FDR 和变化幅度相结合 从而可以快速直观地识别那些变化幅度较大且具有统计
  • 写一篇关于挠脚心的文章

    挠脚心是一种常见的不适症状 它指的是在脚底部或脚趾处感到刺痛或针刺感 挠脚心可能是由于多种原因引起的 其中常见的原因有 高弓足 高弓足是指脚弓高度过高 导致脚底和脚趾处压力过大 引起挠脚心 足部运动损伤 长期运动或活动过度可能导致脚底和脚趾
  • SDNU 1224.Tom'problem B(迪杰斯特拉)

    Description Tom is a student in Shan Dong Normal University his University in the suburbs this day Tom wanted to go to t
  • 《马克思主义基本原理概论》第 1 章世界的物质性及发展规律

    未完待续
  • Python-GIL深度理解

    1 GIL介绍 GIL 意为全局解释器锁 是cPython执行多线程 进程计算密集型代码效果不如人意的主要原因 cPython限制一个进程内同时只能执行一个线程 首先介绍一下 正常多线程 进程执行时 多线程 进程数据混乱的原因 cpu分成多
  • Ubuntu中安装Python的mysqlclient的相关命令

    在Ubuntu中安装Python的mysqlclient的相关命令 安装MySQL数据库 具体步骤如下 apt get update apt get install python pip 已经有pip命令则跳过此步骤 apt get ins
  • 搭建个人网站,服务器应该怎么选择。

    新手怎么去挑选服务器的配置呢 目前不管是个人还是企业 只要是需要在网上开展业务的话 都需要有自己的网站或者应用程序 VPS因为性能较低使用不太方便 渐渐被淘汰出市场 那么在各类服务器的选项下 怎么选择适合的配置呢 一 服务器区域 影响一个网
  • VMware安装ubuntu连接互联网和主机

    1 需求 ubuntu既需要连接互联网也需要和主机进行ssh操作 2 实现 2 1 VMware查看NAT IP 如下图 VMware随机生成的一个IP 无需手动修改 2 2 对虚拟机设置使用NAT模式 2 3 修改物理机网卡 修改物理机v
  • Mybatis、MybatisPlus自定义返回单个Map集合

    1 mybatis返回单个map存单条数据 mapper接口 Map
  • 【Fluent】雷诺方程:推导与求解(附MATLAB代码)

    目录 引言 雷诺方程的推导 雷诺方程的解 雷诺方程的推广 有限体积法 引言 雷诺方程 即湍流的平均运动方程 所属黏性不可压缩流体动力学 从Navier Stokes方程派生 是经典润滑理论的基本方程之一 1886年 奥斯本 雷诺兹 Osbo
  • 【单片机毕业设计】【dz-078】基于物联网的环境测控系统设计

    最近设计了一个项目基于物联网的环境测控系统设计 与大家分享一下 一 基本介绍 项目名 WIFI环境监测 实物 项目编号 mcuclub dz 078 单片机类型 STM32F103C8T6 具体功能 1 通过DHT11检测温湿度 当温湿度超
  • Python判断字符串是否为字母或者数字

    str 1 123 str 2 Abc str 3 123Abc isdigit函数判断是否数字 print str 1 isdigit True print str 2 isdigit False print str 3 isdigit
  • 算法笔记——力扣。持续更新

    动态规划 算法复习 动态规划 HongmingYou 博客园 T583
  • 【tflearn系列教程】(二)如何安装tflearn

    本教程参考自tflearn官方文档 英文版 http tflearn org 主要是对官方文档的翻译与讲解 并结合本人实战经验而作 如有错误 欢迎指出 作者 totorocyx 邮箱 847994259 qq com 转载请联系 一 从te
  • Android Service 加载 GLSurfaceView 显示动画

    先说遇到的需求 要在不影响前台应用的情况下 弹出一些通知 且样式比较花哨 所以用后台Service GLSurfaceView的方式做个小demo 趟一趟路 实现的效果就是这样了 就是桌面有个cube一直转圈圈 不影响其他任何操作 简单来说
  • 西门子1500可编程逻辑控制器语言介绍(1)----CEM语言

    一 CEM的基本信息 1 CEM编程语言介绍 cem编程语言又称因果矩阵 用于快速的将原因与结果之间的关系清晰地表达出来 在该编程语言中 过程事件称为 原因 过程之后的反映称为 结果 一个 原因 可以激活多个结果 结果由列表示 原因与结果的
  • MobaXterm_Personal_10.9 密钥生成及使用

    MobaXterm Personal 个人认为要比PuTTY SmarTTY SecureCRT XShell等SSH终端功能界面交互 功能上好许多 它可以和虚拟机中的Linux共享一套配置信息 本文简单交流一下关于MobaXterm密钥生
  • 【cdk的使用】C语言 跨平台的原子操作

    Github地址 https github com wujin1989 cdk 有过C开发的朋友都知道 在不同平台上原子操作的API是不一样的 这就导致如果想开发一个跨平台的lock free程序是痛苦的 怎么办 凉拌 只能手撸 好在cdk
  • 【读书笔记——开关电源】《精通开关电源设计》(1)

    第一章 开关功率变换原理 文章目录 第一章 开关功率变换原理 前言 1 1 概念和基本术语 1 2 电感 电感充放电的基本原理 功率变化中的稳态与不同工作模式 伏秒定律与占空比 开关器件的使用与保护 1 3 开关拓扑的演变 通过二极管控制感
  • 从自动贩卖机找零看Python中的动态规划问题

    原文 http www jianshu com p 144db81341a3 从自动贩卖机找零看Python中的动态规划问题 问题描述 假设在某国存在 1 x1 x2 x3 xn 多种货币 该国的自动贩卖机在找零时要遵循一个原则 找零的总张