题目大意:52张去除大小鬼的扑克牌,问抽到的牌型有多少种

解题思路:做的时候思路还不够清晰,要加油了,第九届蓝桥杯满打满算只剩39天了!本题可以暴力,要写13个循环,太冗长。于是改用爆搜,从这13个牌型每次搜索一个牌型拿的张数,递归出口是把13种牌型选完从52张牌抽出13张的话次数就+1,本来用一个数组标记拿过的牌的和,但是发现不对,有这样一种情况  例如:1 2 3 4 四种牌型各4张,从中选4张的种数,2+2+3+3=10,发现如果把10标记的话,下次搜到1+1+4+4=10,1+2+3+4=10,2+2+2+4=10等等这些都无法使次数+1,显然这个操作就画蛇添足。然后剪枝的话,当拿到的牌数sum>13的话就去掉。

答案:3598180

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;

int cnt;

void dfs(int x,int sum)
{
	if(sum>13)
		return ;
	if(x>13)
	{
		if(sum==13)
			cnt++;
		return ;
	}
	for(int i=0;i<5;i++)
		dfs(x+1,sum+i);
	return ;
}

int main()
{
	cnt=0;
	dfs(1,0);
	cout<<cnt<<endl;
	return 0;
}