李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
方案1:
package problem;
/**
* 李白打酒
* @author LENOVO
*/
public class LibaiWine {
public static int count=0;
//递归函数
public static void dfs(int h,int d,int wine) {
if(wine<0||h>9||d>5)//递归出口,酒>=0,花<=9,店<=5
return;
if(h==9&&d==5)//h==9的目的为保证最后一次遇见的是花
if(wine==1)
count++;
dfs(h+1,d,wine-1);//遇花,继续搜索
dfs(h,d+1,wine*2);//遇店,继续搜索
}
public static void main(String[] args) {
dfs(0,0,2);//初始2斗酒
System.out.println(count);
}
}
方案2:正好和方案1相反
package problem;
/**
* 李白打酒
* @author LENOVO
*/
public class LibaiWine {
public static int count=0;
public static int dfs2(int d,int h,int wine){
if(d>=1)
dfs2(d-1,h,wine*2);
if(h>=2)
dfs2(d,h-1,wine-1);
if(d==0 && h==1 && wine==1) //保证最后一次遇见的是 花 此时还剩下1斗酒
count++;
return count;
}
public static void main(String[] args) {
dfs2(5,10,2);//初始2斗酒
System.out.println(count);
}
}
答案是:14