李白喝酒问题
“李白街上走,提壶去买酒,遇店加一倍,见花喝一斗”,途中,遇见5次店,见了10此花,壶中原有2斗酒,最后刚好喝完酒,要求最后遇见的是花,求可能的情况有多少种?
分析:题目要求最后是遇见花也就是说最后是喝酒(最好刚好把酒完),出去这种确定的情况,最后剩下的情况是:还有一斗酒,前面遇到了5次店和九次花(打了5次酒,喝了九次酒)。
然后每次情况只有两种分别是遇见花喝酒和遇到店打酒。
//dfs(num-1,mum,s*2)+dfs(num,mum-1,s-1);
遇到店的时候打酒(s*2),然后酒的斗数会翻倍;遇到花时喝酒,然后酒的斗数减一(s-1);
然后设置递归的出口:
当酒喝完还遇见花时,则return 0;以为酒不能是负的;
当5个店已经都遇见过时,则return 0;
当9个花已经都遇见过时,则return 0;
当花刚好遇见完,店刚好遇见完,酒还有一斗时:return 1;
当中间过程,酒喝完了,但是遇见店了,又因为此时s=0,遇到店的时候打酒(s*2),所以要把s设置成0.5;
/***********只是个人理解,欢迎交流*************/
1 #include<stdio.h> 2 int dfs(int num,int mum,int s){ 3 if(s<0 || num<0 || mum<0) 4 return 0; 5 if(num<0 || mum<0) 6 return 0; 7 if(num==0 && mum==0&& s==1) 8 return 1; 9 if(s==0 && num>0 && mum>=0) 10 s=0.5; 11 return dfs(num-1,mum,s*2)+dfs(num,mum-1,s-1); 12 } 13 int main() 14 { 15 printf("%d",dfs(5,9,2)); 16 return 0; 17 }