标题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。
则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
//思路1 排列所有可能
//思路2 递归搜索;
代码1可能是第一时间最容易想到的;
# include<iostream>
# include<algorithm>
# include<string>
using namespace std;
int ans=0;
int main()
{
string na="aaaaabbbbbbbbb";
do
{ int jiu=2;
string str=na;
for(int i=0;i<14;i++)
{
if(str[i]=='a')
jiu*=2;
else if(str[i]=='b')
{
jiu--;
}
}
if(jiu==1)
ans++;
}while(next_permutation(na.begin(),na.end()));
cout<<ans<<endl;
return 0;
代码2
# include<iostream>
using namespace std;
int ans=0;
void f(int jiu,int dian,int hua) //dfs的思想走所有的步,最后找到出口。
{
if(dian==5&&hua==9&&jiu==1)
{
ans++;
return ;
}
if(dian<5)f(jiu*2,dian+1,hua);
if(hua<9)f(jiu-1,dian,hua+1);
}
int main()
{
f(2,0,0);
cout<<ans<<endl;
}
递归的方法:
1.把复杂的问题分解为若干的简单的问题,即以后的每一步都在重复这几个问题。
2.找出口。