題目
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裏突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裏能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多餘的內容或說明文字。
反思
一開始我是用dfs(int step)這裏step表示我發到第step張牌。每次發到一張牌有13種點數選擇,每種點數有1-4(0跳過)張的可能性。剪枝只能想到剪每種點數選擇大於4的剪去(continue)。o(13^13)
其實可以作爲二維dfs(int step, int sum)step代表當前考慮第step種花色,sum代表當前有sum張牌。step爲層數因爲13種都要考慮到,而sum只要最後判斷是否滿足要求即可。o(4^13)
這道題有 13種花色,1-4種拿牌數, 13張牌。分別用step, sum,vis[14]表示。在選擇深搜層數的具體含義時候,應當有所取捨,分清數值的含義是屬於約束條件還是情況。
代碼
#include<bits/stdc++.h>
using namespace std;
int cho[14], cnt;
void dfs(int step, int sum){
if(step == 13){
if(sum == 13) cnt++;
return;
}
for(int i = 0; i<5; i++){
if(cho[step]+i>4) continue;
if(sum+i>13) continue;
cho[step] += i;
dfs(step+1, sum+i);
cho[step] -= i;
}
}
int main(){
cnt = 0;
memset(cho, 0, sizeof(cho));
dfs(0, 0);
printf("%d", cnt);
return 0;
}