文章目录

  • 空瓶换酒-python实现
    • 1.算法分析
      • 1.1 通常情况
      • 1.2 赊账情况

空瓶换酒-python实现

最近学习学习到一种空瓶换酒的算法,其题目描述为:假设一瓶啤酒2元钱,商家为了促销,规定:可以用2个空瓶子换一瓶啤酒,或者用4个盖子换一瓶啤酒。现在你身上有10元钱,可以买多少瓶啤酒。

1.算法分析

1.1 通常情况

首先假设最后可以用空瓶子换到XXX个啤酒,可以用盖子换到YYY个啤酒,同时我们可以用N元钱一开始就买到M个啤酒,就可以得到下面的不等式:
X≤M+X+Y2<X+1X \leq \frac{M+X+Y}{2} < X+1 X≤2M+X+Y​<X+1
Y≤M+X+Y4<Y+1Y \leq \frac{M+X+Y}{4} < Y+1 Y≤4M+X+Y​<Y+1
上述两个公式说明,最后喝到的啤酒数量,肯定不能够再兑换多一个啤酒。

通过化简上述公式,可以得到以下公式:
M+Y−2<X≤M+Y(1)M+Y-2 < X \leq M+Y~~~(1) M+Y−2<X≤M+Y   (1)
M+X−43<Y≤M+X3(2)\frac{M+X-4}{3} < Y \leq \frac{M+X}{3}~~~(2) 3M+X−4​<Y≤3M+X​   (2)
化简上述不等式之后,可以利用不断遍历循环,来验证不同值的情况。

举个例子:
当有10块钱,一开始可以买到M=5M=5M=5的啤酒数量,当Y=1Y=1Y=1时,通过公式(1)可以得到XXX的取值范围为X∈[4,6]X \in [4,6]X∈[4,6]。然后再把XXX和YYY的几种情况代入到公式(2)进行验证。发现上述情况都不符合。

具体的python编程逻辑:

def cal_bar(moneny):x = 0y = 0m = moneny / 2for y in range(10):x_min = m + y -2x_max = m + yif x_max > x_min > 0:for i in range(x_min + 1, x_max + 1):if (m + i - 4) / 3 < y <= (m + i) / 3:return i, yreturn None, None

结果可以喝到15瓶啤酒。

1.2 赊账情况

上面的情况是不能进行赊账的,如果能向老板进行赊账,则有有种原子操作:

  • 目前手上有1个瓶子,向老板借1个瓶子,然后兑换1个啤酒,喝掉啤酒后,还之前借的酒瓶,这时候的情况是:喝了1个啤酒,得到1个盖子
  • 目前手上有2个盖子,向老板借2个盖子,然后兑换1个啤酒,喝掉之后,这时候生产出1个空瓶和1个盖子,利用上面的操作再借空瓶,就可以再喝1个啤酒,这时候就可以还掉2个盖子,实际上:喝了2个啤酒,瓶子和盖子都没有剩下

使用这两种操作,可以得到比不能借的情况下更优的解:

def drink(moneny):total = 0wine, bottle, lid = moneny / 2, 0, 0while True:if wine != 0:total += winebottle += winelid += winewine = 0elif bottle != 0:total += bottlelid += bottlebottle = 0elif lid >= 2:total += (lid / 2) * 2lid %= 2else:breakreturn total

最后可以得到喝了20瓶啤酒。

【算法基础】空瓶换酒相关推荐

  1. 酒瓶换酒编程C语言,巧用公式速解“空瓶换酒”问题

    近年来,公务员考试数学运算部分出题形式越来越灵活,题型方面以极值问题.统筹问题.空瓶换酒等问题为代表.下面广西公务员考试网重点讲解一下"空瓶换酒"的解法. [真题精选]12个啤酒空 ...

  2. Python入门:从空瓶换酒聊起

    Python入门:从空瓶换酒聊起 最近在学习Python的过程中,发现了一道有趣的编程题目--空瓶换酒.这个问题是这样描述的:假设你有m个空瓶子,可以用其中n个空瓶子换一瓶酒.那么,你最终最多能喝到多 ...

  3. 空瓶换酒问题【一行代码】

    [问题] 已知:N个空瓶可以换 1 瓶酒, 问:若小明买m瓶,那么他最终可以喝到几瓶? [声明] N为大于 1 的自然数,否则结果为无穷. 不考虑借空瓶的行为. 空瓶换酒问题简单易懂,可以算是学习编程 ...

  4. Python3多思路解决空瓶换酒问题

    思路导航 前言 一.一行代码 二.迭代求解 三.递归求解 总结 前言   空瓶换酒是一类很经典的智力趣题,也有很多不同的问题版本.本文旨在小结其解决方法,以加深理解.   空瓶换酒的目标是求解最终能喝 ...

  5. 经典数学问题“空瓶换酒”求解(C/C++)

    经典数学问题"空瓶换酒":某啤酒店可用a(>0)个空啤酒瓶换b(<a)瓶啤酒,某人一次购买n瓶啤酒,问其最多能够喝多少瓶啤酒? 通常这类问题希望我们要"投机取 ...

  6. java编写换酒问题,空瓶换酒问题

    例:某商店出售啤酒,规定每5个空啤酒瓶能换1瓶啤酒.张叔叔家买了80瓶啤酒,喝完后再按规定用空啤酒瓶去换啤酒,那么他们家前后共能喝到多少瓶啤酒? 分析与解:我们按照实际换酒过程分析: 喝掉80瓶啤酒, ...

  7. java编写换酒问题,ASP空瓶换酒递归算法题目

    今天有个朋友问我一个小学生的奥数题,酒1元钱1瓶,2个空瓶子可以换一瓶酒,问20块钱可以喝多少瓶酒.我OUT了,我被鄙视了. 我不会,但是谁让我是写代码的呢,写了个小程序用来鄙视他.告诉他,我不仅知道 ...

  8. #1518空瓶换酒问题

    一.题目 难度:简单 小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能 ...

  9. python巧妙解决空瓶换酒问题

    问题: 某超市促销,举办空酒瓶和酒瓶盖换酒活动,规定 2 个空瓶或 4 个瓶盖可换一瓶酒.若小明最开始买了 n 瓶酒,则他总共能喝到多少瓶酒? 思路: 如果瓶子数大于2或盖子数大于4就可以换一瓶酒,而 ...

最新文章

  1. 《标准库time、datetime、calendar、random的使用》
  2. 跨时钟域电路设计——结绳法
  3. 我从大厂面试中学到的关于 C# 的知识
  4. mysql_load
  5. python模拟购物车购物过程_Python基于数列实现购物车程序过程详解
  6. HTTPs 相关的东西
  7. BIGO 使用 Flink 做 OLAP 分析及实时数仓的实践和优化
  8. mac下下载安装mat
  9. winRAR 破解注册码
  10. uni-app详情页开发
  11. 树莓派4支持多大tf卡_树莓派入门指南(Raspberry Pi)
  12. 【Scala笔记——道】Scala 隐式Implicit
  13. jquery和vue分别对input输入框手机号码格式化(344)
  14. windows2012r2文件服务器部署,Windows server 2012部署和配置群集文件服务器
  15. 计算机网络发展趋势多元化,探析计算机网络通信技术现状与未来趋势.doc
  16. Aggressive cows(c语言)
  17. 主力资金是股价的风向标
  18. RSA算法实现(Python版)
  19. Oracle中的各种NAME
  20. 微信小程序开发之大转盘 抽奖

热门文章

  1. dubbo-admin默认账号密码登录失败,root和guest
  2. USB外接电源与锂电池自动切换电路设计
  3. 企微企鲸客SCRM和尘锋SCRM的差异化
  4. 初探Eigen(error C2719: “Qcw”: 具有 __declspec(align('16')) 的形参将不被对齐)
  5. Python中读写文件的read_csv()
  6. 基于R语言的DICE(Dynamic Integrated Model of Climate and Economy)模型
  7. 已解决:mysql报错> 1067 - Invalid default value for ‘comment_date‘ [DTF] 2> wp_links: Getting
  8. 我要自学网计算机基础知识板书,我要自学网PhotoShop视频教程板书
  9. 平分物品 python_python – 为什么平分比排序慢
  10. python set集合排序,Python set的集合操作