# 李白打酒

话说大诗人李白，一生好饮。幸好他从不开车。  
一天，他提着酒壶，从家里出来，酒壶中有酒2斗。他边走边唱：  
无事街上走，提壶去打酒。  
逢店加一倍，遇花喝一斗。  
这一路上，他一共遇到店5次，遇到花10次，已知最后一次遇到的是花，他正好把酒喝光了。   
请你计算李白遇到店和花的次序，可以把遇店记为a，遇花记为b。则：babaabbabbabbbb 就是合理的序。像这样的答案一共有多少呢？请你计算出所有可能方案的个数（包含题目给出的）。

以下<span style="color:red">错误</span>的一项是？

## aop

### before

```cpp

```

### after

```cpp

```

## 答案

```cpp
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

```cpp
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

```cpp
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

```cpp
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;
}
```
