話說大詩人李白,一生好飲。幸好他從不開車。
一天,他提着酒壺,從家裏出來,酒壺中有酒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;
}