每瓶汽水 1 元,2 個空瓶換 1 瓶。20 元最多能喝幾瓶?
初始:money=20, total=20, empty=20
循環:用空瓶換新瓶 → 喝掉 → 產生新空瓶
關鍵:每 2 空瓶換 1 瓶,喝完又得 1 空瓶,實際每喝 1 瓶「消耗」1 空瓶
f(empty) = 0 if empty < 2 f(empty) = empty/2 + f(empty/2 + empty%2) otherwise
#include <stdio.h>
#define MAX 20
int main() {
int money = MAX;
int total = MAX;
int empty = MAX;
while (empty >= 2) {
int new_bottles = empty / 2;
total += new_bottles;
empty = new_bottles + empty % 2; // 新空瓶 + 剩餘空瓶
}
printf("最多能喝 %d 瓶\n", total);
return 0;
}
初始:喝20瓶,空瓶20 第1輪:20空瓶換10瓶,喝10,總30,空瓶10 第2輪:10空瓶換5瓶,喝5,總35,空瓶5 第3輪:5空瓶換2瓶(剩1),喝2,總37,空瓶3(2+1) 第4輪:3空瓶換1瓶(剩1),喝1,總38,空瓶2(1+1) 第5輪:2空瓶換1瓶,喝1,總39,空瓶1 結束:空瓶<2,無法再換 答案:39瓶
若 n 元,2 空瓶換 1 瓶,最大飲用量 = 2n - 1(當 n 為 2 的冪次時精確,其它情況略小)。
20 元 → 39 瓶。
int max_drink(int money, int exchange_rate) {
int total = money;
int empty = money;
while (empty >= exchange_rate) {
int new_b = empty / exchange_rate;
total += new_b;
empty = new_b + empty % exchange_rate;
}
return total;
}