头像

Cyan

四川成都

深度强化学习炼丹师

2014年第五届蓝桥杯省赛-C. 李白打酒

2014年第五届蓝桥杯省赛-C. 李白打酒

2021-12-13 · 67次阅读 · 原创 · 数据结构与算法

原题链接

题面

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒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 协议进行许可