李白饮酒–蓝桥杯原题改编(基于暴力)
题目描述
话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数。
为了使问题更加有趣,我们假设他遇到店
s
s
s次,花
f
f
f次,你的任务是计算此时的方案总数。
输入描述
两个整数 s s s和 f f f,分别表示李白遇到的店和花的次数。( s + f ≤ 20 s+f\leq 20 s+f≤20)
输出描述
一个整数,表示方案总数。
样例
输入
5 10
输出
14
来源
算法课习题
C++实现
将店、花看作二进制0和1
#include <iostream>
int main() {
int s, f, ss, ff, now, ans = 0, i;
std::cin >> s >> f;
for (i = 0; i <= (1 << (s + f-1)); i++) {
ss = 0;
ff = 1;
now = 2;
for (int j = 0; j < (s + f-1); j++) {
if ((i & (1 << j)) == (1 << j)) {
ss++;
now *= 2;
} else {
ff++;
now--;
}
}
now--;
if (now == 0 && ss == s && ff == f) {
ans++;
}
}
std::cout << ans;
return 0;
}