李白打酒(蓝桥杯2014)
1.题目描述:
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
2.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//不需要打印每个具体方案,只给出一共多少方案。
int fun(int store,int flower,int wine)
{
if(store>5 || flower>10)
return 0;
else if(store==5 && flower==9 && wine==1)
{
return 1;
}
int re=0;
re+=fun(store+1,flower,wine*2);
re+=fun(store,flower+1,wine-1);
return re;
}
//打印每个具体方案,并给出一共多少方案
int fun(int store,int flower,int wine, char *str)
{
if(store>5 || flower>10)
return 0;
else if(store==5 && flower==9 && wine==1)
{
printf("%sb\n",str);
return 1;
}
int re=0,len=strlen(str);
char *p=(char *)malloc((len+2)*sizeof(char));
strcpy(p,str);
strcat(p,"a");
re+=fun(store+1,flower,wine*2,p);
strcpy(p,str);
strcat(p,"b");
re+=fun(store,flower+1,wine-1,p);
if(p) free(p);
return re;
}
int main()
{
printf("一共%d个方案\n\n",fun(0,0,2));
printf("一共%d个方案\n",fun(0,0,2,""));
return 0;
}
3.总结:用递归的思想做,题中将酒量的变化分为两类:第一,是遇见店乘2;第二,是遇见花减1.
两种情况的递归计算!