1. 问题描述:
小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序 自己手里能拿到的初始牌型组合一共有多少种呢?
输出
请输出该整数,不要输出任何多余的内容或说明文字。
来源:http://oj.ecustacm.cn/problem.php?id=1253
2. 思路分析:
分析题目可以知道这道题目其实一个排列组合问题,需要尝试所有排列组合方案的可能性,根据这个特点我们可以使用递归解决(递归可以搜索的可能性),但是这道题目有一个限制条件是只考虑点数,不考虑牌的顺序,所以在求解的时候不能够像求解全排列那样对于不同的排序方式计算为不同的方案,其实这道题目可以转换为求解每一个数字出现的次数就可以避免牌的出现顺序的问题,有的时候换一种思考问题的方式可能会使问题的处理变得简单一点
3. 代码如下:
res = 0 # 第一个count参数用来计算当目前为止出现了多少张牌了, 第二个step参数是为了控制走的步数, 因为牌的种类是13所以步数最多在13次 def dfs(count: int, step: int): global res if count > 13 or step > 13: return if count == 13: res += 1 return for i in range(5): dfs(count + i, step + 1) if __name__ == '__main__': dfs(0, 0) print(res)