可以喝多少瓶啤酒

可以喝多少瓶啤酒

问题

4个瓶盖,或者2个酒瓶,可以换一瓶啤酒,

现在有10块钱,啤酒2块钱一瓶,问: 共可以喝多少瓶啤酒?

解法一

问题分析

手里有10块钱,既然要喝尽可能多的啤酒,就要买尽可能的多买,所以直接全部买成啤酒,共可买5瓶。现在共有5瓶啤酒,那么可以进行以下的操作(序号越低,优先级越高):

  1. 如果有酒,则全部喝掉;
  2. 如果有 >= 4个瓶盖,则换成 n/4 瓶啤酒;
  3. 如果有 >= 2个酒瓶,则换成 n/2 瓶啤酒;

显然,如果用程序模拟,实现起来很简单。

结果

代码:

# encoding: utf-8

status = (5, 0, 0) # 5瓶酒,0个瓶盖,0个酒瓶

def drink(status):
    if status[0] != 0:
        return status[0] + drink((0, status[1] + status[0], status[2] + status[0]))
    elif status[1] >= 4:
        return drink((status[1] / 4, status[1] % 4, status[2]))
    elif status[2] >= 2:
        return drink((status[2] / 2, status[1], status[2] % 2))
    else:
        return 0

print drink(status)

输出:

15

那么如果初始不是5瓶,一共可以喝多少瓶呢?

初始 一共
0 0
1 1
2 3
3 7
4 11
5 15
6 19
7 23
8 27
9 31
10 35

解法二

写一段程序虽然方便快捷,但是还是有很多限制,那么有没有别的方法呢?

问题分析

观察 解法一 的输出数列 0 1 3 7 11 15 19 23 27 31 35,可以发现从 3 开始正是一个等差数列,于是:

结果

\begin{equation*}
f(n) =
\begin{cases}
n & \quad n <= 1\ 4n-5 & \quad n > 1\ \end{cases}
\end{equation*}

解法三

问题分析

  1. 如果初始有 1 瓶酒:

    啤酒 瓶盖 酒瓶
    1 0 0
    0 1 1

    共可喝 1 瓶啤酒,剩余 1 个瓶盖,1 个酒瓶。

    即:\(1 \Rightarrow 1 + (0, 1, 1)\)
    (注:表示初始 1 瓶,最终可喝 1
    瓶,剩余 1 个瓶盖 1 个酒瓶)

  2. 如果初始有 2 瓶酒,只要在 1瓶酒 的基础上加 1瓶酒,然后再化简即可:
    啤酒 瓶盖 酒瓶
    0 2 2
    1 2 0
    0 3 1

    共可喝 \(1 + 1 + 1 = 3\)
    瓶洒,剩余 3 个瓶盖,1 个酒瓶。

    即:

      \(1 \Rightarrow 1 + (0, 1, 1)\)
    + \(1 \Rightarrow 1 + (0, 1, 1)\)
    = \(2 \Rightarrow 2 + (0, 2, 2)\)
    = \(2 \Rightarrow 3 + (0, 3, 1)\)
  3. 如果初始有 3 瓶酒,同理,可以在 2瓶酒 的基础上加 1瓶酒,然后化简:
    啤酒 瓶盖 酒瓶
    0 4 2
    1 0 2
    0 1 3
    1 1 1
    0 2 2
    1 2 0
    0 3 1

    共可喝 \(3 + 1 + 3 = 7\)
    瓶酒,剩余 3 个瓶盖,1 个酒瓶。

    即:

      \(2 \Rightarrow 3 + (0, 3, 1)\)
    + \(1 \Rightarrow 1 + (0, 1, 1)\)
    = \(3 \Rightarrow 4 + (0, 4, 2)\)
    = \(3 \Rightarrow 7 + (0, 3, 1)\)

注意,我们发现一个性质:

(0, 3, 1) + (0, 1, 1) = (0, 4, 2) = 3 + (0, 3, 1)

这也意味着,如果我们初始有 2 瓶酒,那么最终可以喝到 3 瓶酒,并剩余 (0, 3, 1)。此后,每拿到 1 瓶额外的酒,就可以再喝这瓶酒本身,加另外可以兑换的 3 瓶酒,即 4
瓶酒,且剩余 (0, 3 , 1)。即对于 n >= 2 的情况,\(f(n) = (n-2) \times 4 + 3 = 4n- 5\)
。因此,可得:

结果

\begin{equation*}
f(n) =
\begin{cases}
n & \quad n <= 1\ 4n-5 & \quad n > 1\ \end{cases}
\end{equation*}

解法四

问题分析

啤酒2元一瓶,4个瓶盖可以换1瓶啤酒,则瓶盖价值0.5元;2个空瓶可以换一瓶啤酒,则空瓶价值1元;进而推出瓶内啤酒的价值是0.5元,所以10元可以喝20瓶。那么具体怎么操作呢?

结果

直接来20瓶,喝完兑换 5+10 瓶,付10元。

时间: 01-27

可以喝多少瓶啤酒的相关文章

每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒? php

//根据题意设定初始变量值//然后 一个while循环去操作//每换得一个瓶子,换的那个减去要做相应的数目//然后喝了啤酒后, 各数量加1//直到不符合要求.跳出循环 1 class Beer{ 2 3 protected $uni_gai = 4; //每4个瓶盖1瓶 4 protected $uni_bottle = 2; //每两个瓶子换1瓶 5 protected $uni_beer = 2; //每瓶2块钱 6 protected $rs = array();//存取结果 7 prot

javascript计算啤酒2元一瓶,4个盖换一瓶,2个瓶换一瓶,10元钱最多喝多少瓶

var n = 0//当前剩下多少瓶加上喝赢了多少瓶 var x = 5//初始多少瓶 var y = 0//除了喝掉的,剩下多少瓶 var z = 0;//总数 var arr = []//定义一个数组存放值 arr.push(x);//先把最初始瓶数添加到数组 //程序1 var fn = function(s){ y = s -4; //剩下多少瓶 s = y + parseInt(s/4) + parseInt(s/2);//剩下多少瓶加上赢了多少瓶 n = s//赋值给上面的n arr

Android:刚6瓶啤酒4两56度白酒下肚,居然20分钟做了一手机版网站 !

刚6瓶啤酒4两56度白酒下肚,居然20分钟不到时间做了一手机版网站 !人有多大潜力你知道吗? 大家有兴趣的可以用手机或微信打开 http://xh.yunxunmi.com/ 看看俺这酒后之做! 更多0

刚6瓶啤酒4两56度白酒下肚,居然20分钟做了一手机版网站 !

刚6瓶啤酒4两56度白酒下肚,居然20分钟不到时间做了一手机版网站 !人有多大潜力你知道吗? 大家有兴趣的可以用手机或微信打开http://xh.yunxunmi.com/ 看看俺这酒后之做! 为了做新闻APP,我居然短短一个月利用业余时间做了:一个通用新闻采集器.一个新闻后台审核网站.一个通用采集器下载网站.一个新闻微网站.一个新闻APP 而且还给新闻微网站和新闻 APP练就了一指禅功力. 人生的价值和意义感觉真的有了! 采集器的开发非常痛苦,曾经有一有那么几天连续奋战到凌晨3,4点 微网站也

java:50瓶可乐,每喝三瓶给你一瓶,请问最后喝了多少瓶.

package jihuoma; //50瓶可乐,每喝三瓶给你一瓶,请问最后喝了多少瓶. public class Test1 { public static void main(String[] args) { int count=50;//统计喝了多少瓶,初值50瓶 int sum=50;//初值50瓶可乐 while(true) { sum=sum-3;//喝三瓶后送一瓶,即下面的count++ count++;//送一瓶 sum=sum+1;//送了一瓶后,那么剩余的可乐数量加1 if(

我只为一瓶啤酒

7月的上海,也不算炎热地铁里总是挤满了出行的各色行人,男的女的,年少年长的,穿超短裤穿人字拖和一身职业装的,都有一个不起眼的小伙子,挤在地铁一边门的角落里,刚从城里会完同学归来突然微信上来了条通知,一个多年未见的兄弟--昔日同窗请求加好友我打开一看,是个当年直言就不用微信的哥们,就不用微信 "卧槽,我这还是第一次用微信,别来无恙啊", 我调侃的说道: "又装逼",他回: 我又调侃"你厉害你厉害,总参谋部xxx单位总工程师啊" "bull

【C语言】【面试题】每瓶汽水1元,两个空瓶可以置换一瓶汽水,现在有20元,最多能喝多少瓶汽水

#include <stdio.h> #define MAX  20 int main() { int money=MAX; int count=MAX; while(1) { if(money%2!=0) { count=count+money-1; break; } else { money=money/2; count+=money; } } printf("%d\n",count); return 0; }

C语言:每瓶汽水1元,两个空瓶可以置换一瓶汽水,现在有20元,最多能喝多少瓶汽水。

#include <stdio.h> #define MAX  20 int main() {  int money=MAX;  int count=MAX;  while(1)  {   if(money%2!=0)   {    count=count+money-1;    break;    }    else   {    money=money/2;    count+=money;    }  }   printf("%d\n",count);  return

java程序实现一个有趣的买啤酒问题

一:问题描述 啤酒2元一瓶,4个瓶盖换一瓶啤酒,2个空瓶换一瓶啤酒,问10元能喝几瓶啤酒? 二:问题分析 针对上述问题,分两种情况:一种是有剩余空瓶和瓶盖且不够兑换的情况:另一种是当剩余瓶盖或空瓶不够兑换时,老板可以配合凑够:我们分别来算出喝多少瓶啤酒.[结果为:喝完第15瓶时有剩余1个空瓶3个盖不够兑换:如果老板配合,喝20瓶啤酒正好无剩余瓶盖和空瓶] 三:程序实现 先实现一个啤酒类: package com.challenge.beer; public class Beer {  /**