天天看點

藍橋杯2015 牌型總數(組合+剪枝)

小明被劫持到X賭城,被迫與其他3人玩牌。

一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。

這時,小明腦子裡突然冒出一個問題:

如果不考慮花色,隻考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?

請填寫該整數,不要填寫任何多餘的内容或說明文字。

思路:

假設有13個桶,每個桶裡面有4張牌,從中抽取任意數量的牌,使得總數為13。

#include<iostream>

using namespace std;

int cnt;

void f(int k,int sum=0) {
	if (k < 13 && sum>13)//剪枝
		return;
	if (k == 13) {
		if (sum == 13)//合法
			cnt++;
		return;
	}
	for (int i = 0; i < 5; i++) {//組合
		sum += i;
		f(k + 1, sum);
		sum -= i;
	}
		
}

int main() {
	f(0,0);
	cout << cnt;
	return 0;
}
           

繼續閱讀