用动态规划算法来求,设dp[j]表示选了j张牌的种类数。
起初dp[j]=0(j>0),dp[0]=1。
第一层枚举牌的种类A?K,第二层倒着枚举当前选了j张(1=<j<=17),第三层dp[j]由dp[j?k]更新而来(1=<k<=4,j?k>=0)。
如果大小王都不在,则有dp[17]种;如果大小王只有一个,则有dp[16]种;如果大小王都在,则有dp[15]种。所以ans=dp[17]+2×dp[16]+dp[15]。
#include<cstdio>
#include<cstring>
int dp[20],ans;//dp[j]表示选j张牌的种类数
int main(){
memset(dp,0,sizeof(int));
dp[0]=1;
for(int i=1;i<=13;i++){//A-K
for(int j=17;j>=1;j--){
for(int k=1;k<=4;k++){
if(j-k>=0) dp[j]=dp[j]+dp[j-k];
}
}
}
ans=dp[17]+2*dp[16]+dp[15];
printf("ans=%d\n",ans);
}
最终求得,斗地主不算花色算大小王,起初发到的17张牌有58684015种
时间: 2024-12-30 08:05:19