标题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
答案:14
先提供两种用枚举方式来解决此问题的方法,前面14个格子要摆放的是0,1(用0标识花,1标识店)
方案一,用0,1把前14个格子按照字典序打印出来,但要保证其0,1的总数小于规定总数。然后模拟这个过程。
代码:
1 /*方法1*/#include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 20 5 using namespace std; 6 int num[MAXN],s=0;//花记为 0,店记为 1 7 void dfs(int cur) 8 { 9 int n0=0,n1=0,i,j,c=2; 10 bool flag=true; 11 if(cur==15) 12 { 13 for(i=1;i<=14;i++) 14 { 15 c=num[i]==0?c-1:c*2; 16 if(c==0) 17 { 18 flag=false; 19 break; 20 } 21 } 22 if(flag==false) 23 return ; 24 else 25 { 26 if(c==1) 27 { 28 s++; 29 for(i=1;i<=14;i++) 30 cout<<num[i]<<' '; 31 cout<<0<<endl; 32 } 33 return ; 34 } 35 } 36 for(i=0;i<=1;i++) 37 { 38 if(i==0) 39 { 40 for(j=1;j<=cur-1;j++) 41 { 42 if(num[j]==0) 43 n0++; 44 } 45 if(n0<9) 46 { 47 num[cur]=0; 48 dfs(cur+1); 49 num[cur]=-1; 50 } 51 } 52 else 53 { 54 for(j=1;j<=cur-1;j++) 55 { 56 if(num[j]==1) 57 n1++; 58 } 59 if(n1<5) 60 { 61 num[cur]=1; 62 dfs(cur+1); 63 num[cur]=-1; 64 } 65 66 } 67 } 68 } 69 int main() 70 { 71 memset(num,-1,sizeof(num)); 72 dfs(1); 73 cout<<s<<endl; 74 return 0; 75 }