牛客寒假算法基础集训营5

本文介绍了一道关于使用有理数运算得到163点的扑克牌问题,通过深度优先搜索(DFS)算法进行求解。叉同学试图通过编写程序作弊,但需要计算在去除大小王后的52张牌中选取6张牌,进行加减乘除运算,使得结果为163的组合数量。代码给出了DFS的实现,并输出了方案总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

众所周知,数回惨败于九峰之前,叉同学还有一段黑历史:163点也玩不过九峰

163点的规则如下:从一副去掉大王小王的扑克牌中抽出六张,A,J,Q,K视为1,11,12,13,用这6张牌经过有理数的加减乘除运算(过程中可以出现分数)且每张牌都用到的情况下,如[9,9,9,7,4,7],可以发现(9+9+7)*4+9*7=163或者(9+9+4+9/7)*7=163

在多次163比试惨败于九峰后,叉同学决定写一个打表程序作弊,但是如果按照52张取6张的思维去枚举,方案有20358520种,考虑到花色不同但牌型相同的组合其实是一样的,所以实际上对于算163点来讲,不同性质的牌组会比(526)\tbinom{52}{6}(652​)小很多,但叉哥的数学水平实在垃圾,并不会算去重后的这个数字。

你可以帮他算出来吗?

输入描述:

本题无输入

输出描述:

输出一个数字表示方案数

思路

利用dfs进行遍历

每一张牌只能被选择四次,每当满足要求(即抽取13张)后sum++;

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int sum=0;
void dfs(int i,int ci){
    if(ci>6) return;
    if(i==13){
        if(ci==6){
            sum++;
        }
        return;
    }
    for(int p=0;p<=4;p++){
        dfs(i+1,ci+p);
        }
    }
     
int main(){
    dfs(0,0);
    cout<<sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值