思路导航

  • 前言
  • 一、一行代码
  • 二、迭代求解
  • 三、递归求解
  • 总结

前言

  空瓶换酒是一类很经典的智力趣题,也有很多不同的问题版本。本文旨在小结其解决方法,以加深理解。
  空瓶换酒的目标是求解最终能喝多少瓶酒?问题的版本有很多种:共有x元,y元一瓶酒,初始有x/y瓶酒,m个酒瓶可以换一瓶酒,n个瓶盖可以换一瓶酒。其还分为不可赊账和可赊账,此处讨论的是不可赊账版本,x/y取为num,m取2,n取4.(可赊账类转换为函数求解问题)


一、一行代码

此类思路的解法也有几种,最简单的思路便是总结规律,手动推导前几次便可发现其规律。

num sum bottle lid
1 1 1 1
2 3 1 3
3 7 1 3
4 11 1 3

故可发现在num>1时:

sum = 4*num-5 if num>1 else 1

故可直接求解出相应答案,还可以利用动态规划的思想进行公式推导(最终结果同)。

二、迭代求解

代码如下(思路见注释):

# 空瓶换酒问题
""" wine:当前酒数量 bottle瓶子数 lid:瓶盖数 """
num = eval(input())
# 非递归思路
wine = num
bottle = 0
lid = 0
sum = 0
while True:if wine==0 and bottle//2==0 and lid//4==0:  #终止条件breakelif wine!=0:     #消耗酒bottle+=winelid+=winesum+=winewine=0elif bottle//2!=0:  #瓶子换酒bot_num = bottle//2wine+=bot_numbottle=bottle%2else:lid_num = lid//4   #瓶盖换酒wine += lid_numlid = lid%4
print(sum)

思路很简单,即迭代求解最终的喝酒数量,迭代的终止条件:当前可饮酒数为0且瓶子数和瓶盖数不支持换新酒。喝酒增加对应的瓶子数和瓶盖数,兑酒消耗对应瓶子数和瓶盖数。

三、递归求解

递归的思路相同,只不过换了种实现方式:

# 递归思路
num = int(input())
def for_wine(sum,wine,bottle,lid):if wine==0 and bottle//2 ==0 and lid//4 ==0:  #终止条件return sumelif wine!=0:   #消耗酒sum+=winereturn for_wine(sum,0,bottle+wine,lid+wine)elif bottle //2!=0:  #瓶兑酒wine+=bottle//2return for_wine(sum,wine,bottle%2,lid)else:wine+=lid//4    #瓶盖兑酒return for_wine(sum,wine,bottle,lid%4)print(for_wine(0,num,0,0))

总结

  以上就是本文的主要内容,本文简要地介绍了空瓶换酒问题,并引出了三种解决思路,并且以python语言模拟实现其求解过程,其他编程语言的实现类似。
  本文的实现可能还存在可以优化的地方,其主要目的是梳理相关解题思路,如有帮助,请点赞支持一下ヽ( ̄▽ ̄)ノ

Python3多思路解决空瓶换酒问题相关推荐

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

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

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

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

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

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

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

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

  5. 【算法基础】空瓶换酒

    文章目录 空瓶换酒-python实现 1.算法分析 1.1 通常情况 1.2 赊账情况 空瓶换酒-python实现 最近学习学习到一种空瓶换酒的算法,其题目描述为:假设一瓶啤酒2元钱,商家为了促销,规 ...

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

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

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

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

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

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

  9. #1518空瓶换酒问题

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

最新文章

  1. 结构控制Switch Case
  2. 厉害了,我的Python,竟然可以这么玩儿......(内含福利)
  3. java数数字及while和do while 的使用,以及程序的调试与验证
  4. 逆向与汇编的一些笔记
  5. c++ primer 5th,练习11.19,编写代码验证
  6. 【CF1047D】Little C Loves 3 II【构造】【赛瓦维斯特定理】
  7. 经典神经网络 -- FPN : 设计原理与pytorch实现
  8. 开源爬虫框架各有什么优缺点?
  9. rabbitMQ概念详细介绍
  10. 深度学习方法在糖尿病视网膜病变诊断中的应用
  11. BouncyCastle使用注意事项
  12. 《outliers》/《异类》读后有所思
  13. python字体加粗代码_如何在python docx中加粗行单元格的文本?
  14. pdf太大怎么缩小兆数?怎样将pdf文档储存变小?
  15. java制作安卓游戏脚本_autoA开源(用java写安卓无障碍脚本)
  16. oracle trim没用,Oracle中Trim函数的使用方法
  17. Axure RP9 中继器的简单操作(1)
  18. elasticsearch7.9操作必看结合官方文档 es head的操作必看 es增删改查全详解
  19. 365天深度学习训练营-第J2周:ResNet50V2算法实战与解析
  20. 2021php高级工程师面试题集

热门文章

  1. 【PyTorch】卷积神经网络
  2. Java中的Zip文件操作
  3. 【Javascript】【注意事项】script标签不能自闭合
  4. CC00006.NavigationLog——|FreeNAS|
  5. 使用python2爬取百度贴吧指定关键字和分页帖子楼主所发的图片
  6. 【微信小程序控制硬件15 】 开源一个微信小程序,支持蓝牙快速配网+WiFi双控制ESP32-C3应用示范;(附带Demo)
  7. location.href 用法详解
  8. 0基础转行IT编程,Java、C++、Linux和Web前端哪种好?
  9. IPFS、Filecoin和lotus的介绍及其关系
  10. 正则表达式抓取网页资源