摘要:
三种喝啤酒的问法
问题简述:
1. 有多少钱喝多少啤酒,多买多送,但是瓶盖不能兑换
2. 给定有几瓶酒,喝完后瓶盖可以兑换,但是不赊账
3. 给定有几瓶酒,喝完后瓶盖可以兑换,但是赊账
算法分析:
问题1:简单无脑的分配钱即可,尽量一次性多买,然后多送
问题二:利用公式递推
一
共
喝
的
啤
酒
数
=
非
空
啤
酒
数
量
+
兑
换
的
数
量
一共喝的啤酒数=非空啤酒数量+兑换的数量
一共喝的啤酒数=非空啤酒数量+兑换的数量
又因为瓶盖可以兑换出满瓶的啤酒,满瓶的啤酒又可以提供一个瓶盖,因此二者相互关联。直到没有满瓶的啤酒和且瓶盖少于兑换的数量时,方可得出正确答案。
问题3:
代码以及详细注释:
问题1:
#include <bits/stdc++.h>
using namespace std;
#define INF 2147483647
int func(int cur){
if(cur>=50)
return func(cur-50)+7;
else if(cur>=30)
return func(cur-30)+4;
else if(cur>=10)
return func(cur-10)+1;
else return 0;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",func(n));
return 0;
}
class Solution {
public:
int n; //定义在外面,方便之后递归时不用传参
int numWaterBottles(int numBottles, int numExchange) {
n=numExchange;
return func(numBottles,0);
}
int func(int cur,int emp)
{//cur表示当前拥有的整瓶啤酒的数量
//emp表示当前拥有的空瓶的数量
if(cur==0&&emp<n)
return 0;
return cur+func(emp/n+cur/n,cur-cur/n*n+emp-emp/n*n);
}
};
def drink(moneny):
total = 0
wine, bottle, lid = moneny / 2, 0, 0
while True:
if wine != 0:
total += wine
bottle += wine
lid += wine
wine = 0
elif bottle != 0:
total += bottle
lid += bottle
bottle = 0
elif lid >= 2:
total += (lid / 2) * 2
lid %= 2
else:
break
return total