牌型种数

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

一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。

这时,小明脑子里突然冒出一个问题:

如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

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

答案:3598180

思路一:暴力法,12层循环枚举取得各个牌得数量(想不到其它方法,这种方法最有效!)

思路二:递归求组合数,从52张牌中选出13张,

代码一:暴力枚举

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a[13];
static int count;
int ans = 0;
for(a[0]=0; a[0]<=4; a[0]++)
{
for(a[1]=0; a[1]<=4; a[1]++)
{
for(a[2]=0; a[2]<=4; a[2]++)
{
for(a[3]=0; a[3]<=4; a[3]++)
{
for(a[4]=0; a[4]<=4; a[4]++)
{
for(a[5]=0; a[5]<=4; a[5]++)
{
for(a[6]=0; a[6]<=4; a[6]++)
{
for(a[7]=0; a[7]<=4; a[7]++)
{
for(a[8]=0; a[8]<=4; a[8]++)
{
for(a[9]=0; a[9]<=4; a[9]++)
{
for(a[10]=0; a[10]<=4; a[10]++)
{
for(a[11]=0; a[11]<=4; a[11]++)
{
for(a[12]=0; a[12]<=4; a[12]++)
{
if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13)
{
count++;
ans = count;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout<<ans<<endl;
return 0;
}

代码二:dfs,递归求组合数,

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int sum=0; //两个参数:pos表示牌的号码1~13 cnt表示当前选择的是第几张牌
//从第1号牌 开始选第一张
void dfs(int pos, int cnt){
//选够了13张牌 sum总数加1
if(cnt==14){
sum++;
return;
}
//选到第14号牌了 还没有选够13张 return
if(pos==14){
return;
}
int num=min(14-cnt,4);//min取两者中的小值 这句话剪枝! for(int i=0;i<=num;i++){
dfs(pos+1,cnt+i); //cnt+i表示当前手里已经选好的牌的数目
}
return;
}
int main(){
dfs(1,1); //增加参数 2个参数:从第1号牌 开始选第一张 不选、选1张...选4张
printf("%d\n",sum);
return 0;
}

代码三:dfs回溯,(超时)。

#include<iostream>
using namespace std; //回溯法:按字典序选择,但是会超时! int have[20];
int sum = 0;
int a[15]; void init(){
for(int i=1;i<=14;i++){
have[i] = 0;
}
} //下面是错误写法:时间复杂度太高 n^n 这里是5^13次方(10亿)
//递归程序中不能有太多循环!
void dfs(int k){
if(k==5){
//判断是否有这个组合
sum++;
for(int j=1;j<14;j++){
cout<<a[j]<<" ";
}
cout<<endl;
return;
}
//循环13次 时间复杂度太高
for(int i=1;i<=13;i++){
if(have[i] < 4){
have[i]++;
a[k] = i;
dfs(k+1);
have[i]--;
}
}
} int main(){
init();
dfs(1);
cout<<sum<<endl;
}

/这道题目给我的思考是,

在用暴力法(dfs递归)的时候直接多想几种可能,

多想几种方案(这里选04张牌,而不是用回溯法从113张中选)

这样可以很大程度上节约时间
/

牌型种数|2015年蓝桥杯B组题解析第七题-fishers的更多相关文章

  1. 2015年蓝桥杯B组C/C++决赛题目

    2015年第六届蓝桥杯B组C/C++国赛题目 点击查看2015年第六届蓝桥杯B组C/C++国赛题解     1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会 ...

  2. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

  3. 第六届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...

  4. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  5. 加法变乘法|2015年蓝桥杯B组题解析第六题-fishers

    加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+1011+12+...+2728+29+ ...

  6. 星系炸弹|2015年蓝桥杯B组题解析第二题-fishers

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

  7. 垒骰子|2015年蓝桥杯B组题解析第九题-fishers

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  8. 移动距离|2015年蓝桥杯B组题解析第八题-fishers

    移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 ...

  9. 九数组分数|2015年蓝桥杯B组题解析第五题-fishers

    九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...

随机推荐

  1. 学习计划 nginx 中 php的配置详解

    本章只看一个刚下载的nginx是如何支持php的 -- location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_inde ...

  2. Unity-反编译由IL生成的DLL文件

        本文由博主SunboyL原创,转载请注明出处:http://www.cnblogs.com/xsln/p/DLL_DeCompilation.html     在Unity实际开发过程中,我们 ...

  3. Storyboard Reference

    在某些情况下.你开发的应用可能包括有各种各样的复杂界面,假设你使用Storyboard来管理这些界面,通常你会将这些界面依照对应的逻辑分成很多子模块,放在不同的storyboard里,比方注冊相关的放 ...

  4. 001-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-第一章 阿里巴巴集团中台战略引发的思考

    1.1.阿里中台发展 组件中台可能问题:组织间业务协作.业务核心能力的沉淀.组织KPI考核等 1.2.企业信息中心发展的症结 1.烟囱式系统建设模式 独立构建独立维护 缺点:1.重复功能建设和维护带来 ...

  5. 11.sklearn.preprocessing.LabelEncoder的作用

    In [5]: from sklearn import preprocessing ...: le =preprocessing.LabelEncoder() ...: le.fit(["p ...

  6. 64位win10+cuda8.0+vs2013+cuDNN V5下Caffe的编译安装教程并配置matlab2014a 接口

    一.需要安装的软件 1)vs2013,我是在http://www.52pojie.cn/thread-492326-1-1.html这个网址安装的.我之前用的是vs2012,按照网上的配置教程会爆各种 ...

  7. [django]form不清空问题解决

    https://www.cnblogs.com/OldJack/p/7118396.html 有时候提交表单后,发现某个字段写错了,但是form的其他字段竟然被清空,这个万万不能接受.所有django ...

  8. R中双表操作学习[转载]

    转自:https://www.jianshu.com/p/a7af4f6e50c3 1.原始数据 以上是原有的一个,再生成一个新的: > gene_exp_tidy2 <- data.fr ...

  9. end=‘’

    print('----------------') a = ['aa','bb','cc','dd','ee'] for i in range(len(a)): print(i,a[i])#默认换行 ...

  10. 改善深层神经网络_优化算法_mini-batch梯度下降、指数加权平均、动量梯度下降、RMSprop、Adam优化、学习率衰减

    1.mini-batch梯度下降 在前面学习向量化时,知道了可以将训练样本横向堆叠,形成一个输入矩阵和对应的输出矩阵: 当数据量不是太大时,这样做当然会充分利用向量化的优点,一次训练中就可以将所有训练 ...