鱼C论坛

 找回密码
 立即注册
查看: 5039|回复: 11

[技术交流] python小练习(026):用python求解喝汽水问题

[复制链接]
发表于 2016-11-28 11:34:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python小练习(025),传送门

今天我们来看这样一道有意思的题目:喝汽水问题。

题目是这样的:
某个超市推出某品牌汽水促销活动。
活动规则:
1. 收集该品牌汽水的2个“空瓶”可以换取1瓶完整的汽水
2. 收集该品牌汽水的4个“瓶盖“可以换取1瓶完整的汽水

假设现在你有20瓶汽水,根据这个规则,你最多可以喝多少瓶汽水(考虑不能欠费或者租借的情况)

加分题:
假设现在你有20瓶汽水,根据这个规则,你最多可以喝多少瓶汽水(考虑可以租借,但最终不能欠费的情况)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-28 13:04:27 | 显示全部楼层
预留2楼

其实这题当时在微信的朋友圈也流行过一段时间。
用价值的方法,分析这道题目,其实很简单:
一瓶汽水,由汽水、瓶子和瓶盖组成,已知2瓶子可以换1瓶汽水,4瓶盖可以换1瓶汽水,那么如果假设1瓶汽水的价值为1,则1个瓶子的价值就是0.5,同样1个瓶盖的价值就是0.25,那么汽水的价值就是1-0.5-0.25=0.25。
所以如果假设有20瓶汽水,那么等价于有20/0.25=80的汽水(如果条件允许可以任意等价交换的话)。
当然,如果不允许租借的话,等于设立了额外的附加条件,约束了等价交换,那么实际上就喝不到80瓶汽水了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 21:48:20 | 显示全部楼层
解答:
不能租借或欠费的情况:
  1. class cola:
  2.     def __init__(self,n):   #初始化
  3.         self.cola = 0       #喝完的汽水数量
  4.         self.full = n       #满瓶的汽水数量
  5.         self.bottle = 0     #空瓶的数量
  6.         self.cap = 0        #瓶盖的数量
  7.     def b2f(self):          #定义空瓶换满瓶的汽水
  8.         while self.bottle>=2:
  9.             self.full += 1
  10.             self.bottle -= 2
  11.     def c2f(self):          #定义瓶盖换满瓶的汽水
  12.         while self.cap>=4:
  13.             self.full += 1
  14.             self.cap -= 4
  15.     def drink(self):        #定义喝汽水
  16.         while self.full>=1:
  17.             self.cap += 1
  18.             self.bottle += 1
  19.             self.full -= 1
  20.             self.cola += 1
  21. drinking = cola(20)         #实例化
  22. while True:                 #主循环
  23.     drinking.drink()
  24.     drinking.b2f()
  25.     drinking.c2f()
  26.     if drinking.full <= 0:  #直到没有满瓶汽水了跳出循环
  27.         print ('一共喝了%d瓶汽水,还剩下%d个空瓶和%d个瓶盖' % (drinking.cola,drinking.bottle,drinking.cap))
  28.         break
复制代码

输出:
一共喝了75瓶汽水,还剩下1个空瓶和3个瓶盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 21:50:29 | 显示全部楼层
可以租借但最终不能欠费的情况:
  1. class cola:
  2.     def __init__(self,n):   #初始化
  3.         self.cola = 0       #喝完的汽水数量
  4.         self.full = n       #满瓶的汽水数量
  5.         self.bottle = 0     #空瓶的数量
  6.         self.cap = 0        #瓶盖的数量
  7.         self.borrowbottle = 0
  8.         self.borrowcap = 0
  9.     def b2f(self):          #定义空瓶换满瓶的汽水
  10.         while self.bottle>=2:
  11.             self.full += 1
  12.             self.bottle -= 2
  13.     def c2f(self):          #定义瓶盖换满瓶的汽水
  14.         while self.cap>=4:
  15.             self.full += 1
  16.             self.cap -= 4
  17.     def drink(self):        #定义喝汽水
  18.         while self.full>=1:
  19.             self.cap += 1
  20.             self.bottle += 1
  21.             self.full -= 1
  22.             self.cola += 1
  23.     def borrow(self):       #定义有条件租借
  24.         if self.bottle >= 1 and self.borrowbottle == 0:
  25.             self.bottle += 1
  26.             self.borrowbottle += 1
  27.         if self.cap >= 1 and self.borrowcap == 0:
  28.             self.bottle += 1
  29.             self.cap += 3
  30.             self.borrowbottle += 1
  31.             self.borrowcap += 3
  32.     def return_(self):      #定义归还
  33.         while self.borrowbottle >= 1:
  34.             self.borrowbottle -= 1
  35.             self.bottle -= 1
  36.         while self.borrowcap >= 1:
  37.             self.borrowcap -= 1
  38.             self.cap -= 1
  39. drinking = cola(20)         #实例化
  40. while True:                 #主循环
  41.     drinking.drink()
  42.     drinking.b2f()
  43.     drinking.c2f()
  44.     drinking.borrow()       #有条件租借
  45.     drinking.b2f()
  46.     drinking.c2f()
  47.     drinking.return_()      #归还
  48.     if drinking.full <= 0:  #直到没有满瓶汽水了跳出循环
  49.         print ('一共喝了%d瓶汽水,还剩下%d个空瓶和%d个瓶盖,还欠%d空瓶和%d瓶盖' % (drinking.cola,drinking.bottle,drinking.cap,drinking.borrowbottle,drinking.borrowcap))
  50.         break
复制代码

输出:
一共喝了80瓶汽水,还剩下0个空瓶和0个瓶盖,还欠0空瓶和0瓶盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-10 22:50:43 | 显示全部楼层
本帖最后由 Jonin616 于 2017-2-10 23:39 编辑
  1. def drinker():
  2.     soft_drink = 20
  3.     bottle = 0
  4.     lid = 0
  5.     sum = 0
  6.    
  7.     bottle += soft_drink
  8.     lid += soft_drink
  9.     sum += soft_drink
  10.     soft_drink = 0
  11.     while True:
  12.         if soft_drink or bottle >=2 or lid >=4:
  13.                 bottle += soft_drink
  14.                 lid += soft_drink
  15.                 sum += soft_drink
  16.                 soft_drink = 0
  17.                 if bottle >= 2:
  18.                     soft_drink = bottle // 2
  19.                     bottle = bottle % 2   
  20.                 elif lid >= 4:
  21.                     soft_drink = lid // 4
  22.                     lid = lid % 4
  23.         else:
  24.             print('一共喝了%d瓶软饮料' % sum)
  25.             print('剩下空瓶%d个' % bottle)
  26.             print('剩下瓶盖%d个' % lid)
  27.             break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-10 22:52:11 | 显示全部楼层
jerryxjr1220 发表于 2016-11-28 21:48
解答:
不能租借或欠费的情况:

类对象还不习惯运用 先把你这段代码抄几遍消化一下再说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 15:37:39 | 显示全部楼层
本帖最后由 余欲渔 于 2017-2-23 15:53 编辑

不借不欠:
  1. qs,pg,qsp,ylpg,pyqsp=20,20,20,0,0
  2. while True:
  3.     if qsp<2 and pg<4:break
  4.     xqs=pg//4+qsp//2
  5.     qs+=xqs
  6.     ylpg=pg%4
  7.     ylqsp=qsp%2
  8.     pg=xqs+ylpg
  9.     qsp=xqs+ylqsp
  10.     ylpg=0
  11.     ylqsp=0
  12. print(qs)
复制代码

  1. === RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\汽水.py ===
  2. 75 3 1
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 15:48:50 | 显示全部楼层
本帖最后由 余欲渔 于 2017-2-23 15:53 编辑

可借可欠的情况,我预借2个瓶盖和1个空瓶进去,最后剩余2个瓶盖和1个空瓶
  1. qs,pg,qsp,ylpg,pyqsp=20,22,21,0,0
  2. while True:
  3.     if qsp<2 and pg<4:break
  4.     xqs=pg//4+qsp//2   
  5.     ylpg=pg%4
  6.     ylqsp=qsp%2
  7.     pg=xqs+ylpg
  8.     qsp=xqs+ylqsp
  9.     ylpg=0
  10.     ylqsp=0
  11.     qs+=xqs
  12. print(qs,pg,qsp)
复制代码

  1. === RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\汽水.py ===
  2. 80 2 1
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 15:56:37 | 显示全部楼层
当然这里预借的瓶盖和汽水瓶完全可以用两个变量来让python自己判定,只要剩余的大于等于预借的就能成立,最后看怎么喝的多,预借的瓶盖数一定少于4个,空瓶数一定少于2个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-15 11:43:02 | 显示全部楼层
  1. def soft_drinks(x):
  2.     full_bottle = x
  3.     empty_bottle = 0
  4.     cap = 0
  5.     count = 0
  6.     while full_bottle:
  7.         full_bottle -= 1
  8.         count += 1
  9.         empty_bottle += 1
  10.         if empty_bottle == 2:
  11.             full_bottle += 1
  12.             empty_bottle -= 2
  13.         cap += 1
  14.         if cap == 4:
  15.             full_bottle += 1
  16.             cap -= 4
  17.     return(count)

  18. if __name__ == '__main__':
  19.     print(soft_drinks(20))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 10:07:30 | 显示全部楼层
不懂为什么设置借的条件不同,结果不同,剩3个瓶盖才能借,和剩1个瓶盖才能借。两者之间总是差两瓶和两个瓶盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 16:09:11 | 显示全部楼层
  1. cola=20
  2. bottle,cap=cola,cola
  3. while True:       
  4.         drink=bottle//2+cap//4
  5.         if drink==0:break
  6.         bottle=bottle%2+drink
  7.         cap=cap%4+drink
  8.         cola+=drink       
  9. print ('一共喝了%d瓶汽水,还剩下%d个空瓶和%d个瓶盖'% (cola,bottle,cap))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表