int fun(int store, int flower, int wine, int i) {
if (store > 5 || flower > 10) return 0;
else if (store == 5 && flower == 10 && i == 15) {
if (wine == 0 && a[14] == 'b') count++;
}
a[i] = 'a';
fun(store+1, flower, wine*2, i+1); // ❌ 忽略返回值
a[i] = 'b';
fun(store, flower+1, wine-1, i+1); // ❌ 忽略返回值
return count; // 全局變量 count 干擾遞歸純度
}
遞歸函數**必須**將子問題的返回值聚合:
// 錯誤:調用後不接收返回值
fun(...);
// 正確:聚合子問題結果
int left = fun(...);
int right = fun(...);
return left + right;
int dfs(int store, int flower, int wine) {
// 剪枝:超出限制
if (store > 5 || flower > 10) return 0;
// 終止條件:最後一次必須是花(flower=10),酒剛好喝完(wine=1)
// 注意:題目說「最後一次遇到的是花」,所以遞歸到 flower=10 時 wine 應為 1(喝完變 0)
if (store == 5 && flower == 9 && wine == 1) return 1;
int total = 0;
// 遇店:酒翻倍
total += dfs(store + 1, flower, wine * 2);
// 遇花:喝一斗(酒-1)
total += dfs(store, flower + 1, wine - 1);
return total;
}
int main() {
printf("總方案數: %d\n", dfs(0, 0, 2)); // 初始酒 2 斗
return 0;
}
| 參數 | 含義 | 範圍 |
|---|---|---|
| store | 遇店次數 | 0~5 |
| flower | 遇花次數 | 0~10 |
| wine | 當前酒量(斗) | 0~32 (最大 2*2^5) |