题目描述
标题:李白打酒 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
代码演示(两种)
答案:14
方式一:记录所有方案,并打印输出所有情况
public class Main { private static char[] a = new char[16]; private static int ans; //递归的思想 /** * jiu:酒壶中的斗数,dian:是遇见的店数,hua:是碰到花次数,c表示'a'或'b'分别表示遇到店与花 */ public static void fun(int doushu,int dian,int hua,char c){ //不符合情况的结束 if(doushu<0||dian>5||hua>10) return; a[dian+hua] = c; //符合情况进行计数 if(doushu == 0 && dian == 5 && hua == 10 && c=='b'){ ans++; System.out.println(Arrays.toString(a)); return; } //遇到店的情况 fun(doushu*2, dian+1, hua, 'a'); //遇到花的情况 fun(doushu-1, dian, hua+1, 'b'); } public static void main(String[] args) { fun(2,0,0,' '); System.out.println(ans); } }
方式二:直接来求得情况数,打印输出
public class Main { //表示情况数 private static int ans; public static void main(String[] args) { //初始设置遇见花是9次,是因为题目说最后遇见的是花,用于找出口 fun(5, 9, 2); System.out.println(ans); } private static void fun(int dian,int hua,int jiu){ //符合最后情况的ans进行累加 这里hua=0 jiu=1是遇见花前一次的状态,这里作为出口 if(dian == 0 && hua==0 && jiu==1 ) ans++; //如果遇见店以及花次数大于0,进行往下递归 if(dian>0){ fun(dian-1, hua, jiu*2); } if(hua>0){ fun(dian, hua-1, jiu-1); } } }