# 李白打酒 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 以下错误的一项是? ## 答案 ```c int main() { int a[15] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2}; int n = 0; do { int sum = 2; for (int i = 0; i < 15; i++) { if (a[i] == -1) { sum += a[i]; } else { sum *= a[i]; } } if (a[14] == -1) { n += 1; } } while (next_permutation(a, a + 15)); cout << n << endl; return 0; } ``` ## 选项 ### A ```c int res = 0; void f(int dian, int hua, int jiu) { if (dian == 0 && hua == 0 && jiu == 1) { res++; } if (dian > 0) f(dian - 1, hua, jiu * 2); if (hua > 0) f(dian, hua - 1, jiu - 1); } int main(int argc, char **argv) { f(5, 9, 2); cout << res << endl; return 0; } ``` ### B ```c int main() { int ans = 0; for (int i = 0; i < (1 << 14); ++i) { int tot_1 = 0; int tot_0 = 0; int num = 2; for (int j = 0; j < 14; ++j) { if (i & (1 << j)) { tot_1++; num = num * 2; } else { tot_0++; num = num - 1; } } if (tot_1 == 5 && tot_0 == 9 && num == 1) { ++ans; } } cout << ans; } ``` ### C ```c int cnt; void dfs(int a, int b, int sum, int u, int flag) { if (u == 15) { if (a == 5 && b == 10 && sum == 0 && flag == 0) { cnt++; return; } } else { dfs(a + 1, b, sum * 2, u + 1, 1); dfs(a, b + 1, sum - 1, u + 1, 0); } } int main() { dfs(0, 0, 2, 0, 0); cout << cnt; return 0; } ```