这是14年蓝桥杯的一道填空题
题目:“李白街上走,提壶去买酒,遇店加一倍,见花喝一斗”,
途中,遇见5次店,见了10此花,壶中原有2斗酒,最后刚好喝
完酒,要求最后遇见的是花,求可能的情况有多少种?
/*
原理:起点位置店和花都为0,酒为2。遇到一次店,酒*2。遇
到一次花,酒-1,当5次店和9次花都遇完,酒为1。递归终止条
件为:店和花超过题中所给或满足题目要求。
*/#include <stdio.h>int count = 0;void fun(int store, int flower, int alco)
{//先确定递归终止条件if (5 < store || 10 < flower) {return ;}if (5 == store && 9 == flower){if (1 == alco){count++;}return ;}//终止条件结束fun(store + 1, flower, alco * 2);fun(store, flower + 1, alco - 1);
}int main()
{fun(0, 0, 2); //初始情况:酒为2,其余为0printf ("共有 %d 种可能\n", count);return 0;
}
既然这题是填空题,那有没有直接点的办法?
当然有,用排列组合来求:
要求最后一次是花,那倒数第二次肯定也是花不然酒不可能变成1。那第13次结束酒应该有2。也就是说前13次里遇到了5次店和8次花,
酒从开始的2到最后的2,总共加了8又喝掉了8,5次加酒共加了8,8 = 1+1+2+2+2。即总共有C(5,2)=10种可能,
然而还少了加3的情况,即8 = 1+2+3+1+1,而加3只可能出现在酒从4喝到3再遇到店的时候,所以加3只可能出现在加2之后,
2和3是绑定的,有C(4,1)= 4种,所以总共有 C(5,2)+C(4,1)=14种情况。(文字叙述起来有点繁琐)