【算法基础】空瓶换酒
文章目录
- 空瓶换酒-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瓶啤酒。
【算法基础】空瓶换酒相关推荐
- 酒瓶换酒编程C语言,巧用公式速解“空瓶换酒”问题
近年来,公务员考试数学运算部分出题形式越来越灵活,题型方面以极值问题.统筹问题.空瓶换酒等问题为代表.下面广西公务员考试网重点讲解一下"空瓶换酒"的解法. [真题精选]12个啤酒空 ...
- Python入门:从空瓶换酒聊起
Python入门:从空瓶换酒聊起 最近在学习Python的过程中,发现了一道有趣的编程题目--空瓶换酒.这个问题是这样描述的:假设你有m个空瓶子,可以用其中n个空瓶子换一瓶酒.那么,你最终最多能喝到多 ...
- 空瓶换酒问题【一行代码】
[问题] 已知:N个空瓶可以换 1 瓶酒, 问:若小明买m瓶,那么他最终可以喝到几瓶? [声明] N为大于 1 的自然数,否则结果为无穷. 不考虑借空瓶的行为. 空瓶换酒问题简单易懂,可以算是学习编程 ...
- Python3多思路解决空瓶换酒问题
思路导航 前言 一.一行代码 二.迭代求解 三.递归求解 总结 前言 空瓶换酒是一类很经典的智力趣题,也有很多不同的问题版本.本文旨在小结其解决方法,以加深理解. 空瓶换酒的目标是求解最终能喝 ...
- 经典数学问题“空瓶换酒”求解(C/C++)
经典数学问题"空瓶换酒":某啤酒店可用a(>0)个空啤酒瓶换b(<a)瓶啤酒,某人一次购买n瓶啤酒,问其最多能够喝多少瓶啤酒? 通常这类问题希望我们要"投机取 ...
- java编写换酒问题,空瓶换酒问题
例:某商店出售啤酒,规定每5个空啤酒瓶能换1瓶啤酒.张叔叔家买了80瓶啤酒,喝完后再按规定用空啤酒瓶去换啤酒,那么他们家前后共能喝到多少瓶啤酒? 分析与解:我们按照实际换酒过程分析: 喝掉80瓶啤酒, ...
- java编写换酒问题,ASP空瓶换酒递归算法题目
今天有个朋友问我一个小学生的奥数题,酒1元钱1瓶,2个空瓶子可以换一瓶酒,问20块钱可以喝多少瓶酒.我OUT了,我被鄙视了. 我不会,但是谁让我是写代码的呢,写了个小程序用来鄙视他.告诉他,我不仅知道 ...
- #1518空瓶换酒问题
一.题目 难度:简单 小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能 ...
- python巧妙解决空瓶换酒问题
问题: 某超市促销,举办空酒瓶和酒瓶盖换酒活动,规定 2 个空瓶或 4 个瓶盖可换一瓶酒.若小明最开始买了 n 瓶酒,则他总共能喝到多少瓶酒? 思路: 如果瓶子数大于2或盖子数大于4就可以换一瓶酒,而 ...
最新文章
- 《标准库time、datetime、calendar、random的使用》
- 跨时钟域电路设计——结绳法
- 我从大厂面试中学到的关于 C# 的知识
- mysql_load
- python模拟购物车购物过程_Python基于数列实现购物车程序过程详解
- HTTPs 相关的东西
- BIGO 使用 Flink 做 OLAP 分析及实时数仓的实践和优化
- mac下下载安装mat
- winRAR 破解注册码
- uni-app详情页开发
- 树莓派4支持多大tf卡_树莓派入门指南(Raspberry Pi)
- 【Scala笔记——道】Scala 隐式Implicit
- jquery和vue分别对input输入框手机号码格式化(344)
- windows2012r2文件服务器部署,Windows server 2012部署和配置群集文件服务器
- 计算机网络发展趋势多元化,探析计算机网络通信技术现状与未来趋势.doc
- Aggressive cows(c语言)
- 主力资金是股价的风向标
- RSA算法实现(Python版)
- Oracle中的各种NAME
- 微信小程序开发之大转盘 抽奖
热门文章
- dubbo-admin默认账号密码登录失败,root和guest
- USB外接电源与锂电池自动切换电路设计
- 企微企鲸客SCRM和尘锋SCRM的差异化
- 初探Eigen(error C2719: “Qcw”: 具有 __declspec(align('16')) 的形参将不被对齐)
- Python中读写文件的read_csv()
- 基于R语言的DICE(Dynamic Integrated Model of Climate and Economy)模型
- 已解决:mysql报错> 1067 - Invalid default value for ‘comment_date‘ [DTF] 2> wp_links: Getting
- 我要自学网计算机基础知识板书,我要自学网PhotoShop视频教程板书
- 平分物品 python_python – 为什么平分比排序慢
- python set集合排序,Python set的集合操作