1. 题目
2. 思路
(1) 递归
- 根据现有的酒与空瓶,计算本轮能喝到的酒,然后递归获取下一轮能喝到的酒即可。
(2) 数学法
- 用e个空瓶换1瓶酒后又会产生1个空瓶,因此,每次换酒会损失e-1个空瓶。
- 由于b瓶酒会产生b个空瓶,当b<e时不能再换酒,假设一共可以换n瓶酒,则b-n(e-1)>=e,即n=(b-e)/(e-1)+1时,不能再换酒,此时n+b即为最多能喝到的酒。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
private int numExchange;
public int numWaterBottles(int numBottles, int numExchange) {
this.numExchange = numExchange;
return recur(numBottles, 0);
}
private int recur(int numBottles, int numEmpty) {
if (numBottles + numEmpty < numExchange) {
return numBottles;
}
int drink = numBottles + numEmpty / numExchange;
int empty = numBottles + numEmpty % numExchange;
return drink + recur(empty / numExchange, empty % numExchange);
}
}
class Solution1 {
public int numWaterBottles(int numBottles, int numExchange) {
return numBottles >= numExchange ? (numBottles - numExchange) / (numExchange - 1) + 1 + numBottles : numBottles;
}
}