话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
思路:已知最后一次遇到的是花,他正好把酒喝光了,所以前面14次遇到店5次,花9次,酒剩一斗。
(1)给出方案
#include<algorithm>
#include<cstdio>
using namespace std;
int a[20];
int d1 , d2;
void dfs(int pos , int sum){
int i;
if(pos == 15 && sum == 1 && d1 == 5 && d2 == 9){
for( i = 1 ; i<=14 ; i++)
printf("%d" ,a[i]);
printf("\n");
return ;
}
if(pos >= 15) return ;
a[pos] = 1;
d1++;
dfs(pos+1 , sum*2);
d1--;
a[pos] =0;
d2++;
dfs(pos+1 , sum-1);
d2--;
}
int main(){
d1 = 0 ;
d2 = 0;
dfs(1 , 2);
return 0;
}
(2)只给出方法总数
#include<cstdio>
using namespace std;
int count = 0;
void dfs(int store , int flow , int acho){
if(store >5 || flow >9 ) return ;
if(store == 5 && flow == 9){
if(acho == 1){
count ++;
return ;
}
else
return;
}
dfs(store+1 , flow , acho*2);
dfs(store , flow+1 , acho-1);
}
int main(){
dfs(0,0,2);
printf("%d" , count);
return 0;
}