标题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
思路:
- 由于遇店与遇花的动作不同,分两种情况分析
- 可将李白遇到花和店的次序的可能遍历出来,将满足题目条件的方案记录下来即可。由于遇到次数15次,次数比较多,用枚举遍历时间复杂度太大了,最好采用回溯、递归、dfs。
递归算法—代码如下:
#include<iostream>
using namespace std;
int s=0; //记录方法的个数
void fun(char zifu[],int k,int d,int wine){ //k表示第k次遇到,d表示遇到店的次数,wine表示还剩下的酒
if(k==15){
if(zifu[k-1]=='b' && wine==0 && d==5){ //保证最后一次遇花,酒喝完,遇店5次
s++;
for(int i=0;i<15;i++){
cout<<zifu[i];
}
cout<<endl;
return ;
}
else return ;
}
zifu[k]='a';
fun(zifu,k+1,d+1,wine*2); //遇店,遇到次数加一,遇店次数加一,酒加倍
zifu[k]='b';
fun(zifu,k+1,d,wine-1); //遇花,遇到次数加一,遇店次数不变,酒喝一斗
}
int main(){
char zifu[15];
fun(zifu,0,0,2);
cout<<s<<endl;
return 0;
}
答案:14
注意点:本题容易忽略遇店5次,遇花10次这个条件,并不等同于遇到次数15次,还要限定调用遇花、遇店函数的次数。