7.小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
思路:递归,一张一张拿,一种一种挑
#include<stdio.h>
int ans=0;
void dfs(int n,int i)
{
if(n==0){
ans++;
return ;
}
if(i>13||n<0)return ; //想挑第14种牌i<13,或者拿的牌超过了13张 n<0
dfs(n,i+1); //第i种一张都不拿,挑下一种
dfs(n-1,i+1);//拿了一张,挑下一种
dfs(n-2,i+1);//拿了两张,挑下一种
dfs(n-3,i+1);//拿了三张,挑下一种
dfs(n-4,i+1);//拿了四张,挑下一种
}
int main()
{
dfs(13,1);//我要拿13张牌,从第1种牌开始挑
printf("%d\n",ans);
}
答案:
3598180
if(i>13||n<0)return ;这句话很重要
1.一开始我是这么写 if(i>=13)return; 这样就相当于第13种牌没有取,结果错误
2.修改后if(i>=13)return; 代码运行很慢,看了别人的代码后,添加了n<0的判断条件,因为当n<0的时候再递归也就没意义了
3.哎,一直不够细心,dfs(n,i+1)的情况没有写上
写题要自信,细心,加油