题面
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花 10 次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为 a,遇花记为 b 。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
题解
DFS
遍历每次到达的是店还是花,即状态 DFS(遇到店的数量,遇到花的数量,上一次访问的是花还是店,酒的剩余量)
,其起始状态为 dfs(0, 0, 0, 2)
或者 dfs(0, 0, 1, 2)
,因为最开始时没有到过任何地方,所第三个参数任取。
在遍历状态的时候注意剪枝,因为最多到达店5次,花10次,在经过的数量超过时注意剪枝。另到达递归终点即遇到的花和店达到规定数量时,需判断到达这个状态的最后一次遇到的是不是花,且是不是刚好把酒喝完了,满足要求才累加答案。
代码
#include<iostream>
using namespace std;
int res;
void dfs(int shop, int flower, int kind, int wine) {
if (shop == 5 && flower == 10) {
if (wine == 0 && kind == 1) res++;
return;
}
if (shop < 5) dfs(shop + 1, flower, 0, wine * 2);
if (flower < 10) dfs(shop, flower + 1, 1, wine - 1);
}
int main() {
dfs(0, 0, 0, 2);
cout << res << endl;
return 0;
}
标题: | 2014年第五届蓝桥杯省赛-C. 李白打酒 |
---|---|
链接: | https://www.fightingok.cn/detail/166 |
更新: | 2022-09-18 22:44:40 |
版权: | 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可 |