题目:

小明被劫持到X 赌城,被迫与其他 3 人玩牌一副扑克牌 (去掉大小王牌,共 52 张),均发给 4个人,每个人 13 张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自已手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字

代码:

public class Main {
static int result=0; //储存结果种数
public static void main(String[] args) {
select(0,0);
System.out.println(result);
}
public static void select(int x,int y){ //递归
if (x>13||y>13){
return;
}
if (x==13&&y==13){
result++;
return;
}
for (int i=0;i<5;i++){ //0,1,2,3,4,共五种情况
select(x+1,y+i);
}
}
}

思路:

可以拿十三次每次拿一张牌,但每张牌都要有十三种情况拿到所以复杂度是13^13复杂度过高。所以换一种思路

13种牌每张牌只有四张,所以我们拿十三张牌每种牌的个数可能是0,1,2,3,4张,共五种情况。

所以我们采取递归思想:

select(int x,int y);

x:目前在拿哪张牌(牌型)。

y:总共拿了多少张牌。

这样每张牌从十三种情况变为了五种,复杂度变为了5^13,并且如果在中途y>13那么可以直接舍弃这种情况(比如1取了4张,2取了4张,3取了4张,4取了4张总共已经16张牌舍弃),如果取到了第十三种牌型的牌,而且总数正好是13则种数加1。