163小孩--组合

题目


众所周知,数回惨败于九峰之前,叉同学还有一段黑历史: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​)小很多,但叉哥的数学水平实在垃圾,并不会算去重后的这个数字。

你可以帮他算出来吗?

无输入

输出一个方案数

分析

从1~13中任选6个数,每个数字最多选4次,因为选出的所以方案都可以算出163,用组合的知识解决,分析出所有方案

  1. C(13,6)(=1716)----数字无重复(例.123456)
  2. C(13,5)​×C(5,1)​(=6435)----有一个数字出现了两次,其余均出现一次(例.112345)
  3. C(13,4)×C(4,1)(=2860)----有一个数字出现了三次,其余均出现一次(例.111234)
  4. C(13,3)​×C(3,1)(=858)----有一个数字出现了四次,其余均出现一次(例.111123)
  5. C(13,4)​×C(4,2)(=4290)----有两个数字出现了两次,其余均出现一次(例.112234)
  6. C(13,2)(=78)----有两个数字出现三次(例.111222)
  7. C(13,3)(=286)----有三个数字出现两次(例.112233)
  8. C(13,2)×C(2,1)(=156)----有一个数字出现两次,一个数字出现四次(例.112222)
  9. C(13,3)​×C(3,1)×C(2,1)​(=1716)----有一个数字出现两次,一个数字出现三次,其余均出现一次(例.112223)

将所有的方案数加起来,手算最后直接输出结果,或者写函数求出组合数结果,再加起来

最后结果是18395

#include<iostream>
using namespace std;
int main(){
    cout<<18395;
}

#include<iostream>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
int d[10],su;
int sum=0;
int RK(int n,int k,int d[],const int NUM)
{
	int i = n;
	if(k > n) return sum;
	while(i>=k)
	{
		d[NUM-k] = i;
		if(k>1) RK(i-1,k-1,d,NUM);
		else	
			sum++;
		
		i--;}
		return sum;}
int main(){ 
	su+=RK(13,6,d,6);sum=0;
	su+=RK(13,5,d,5)*5;sum=0;
	su+=RK(13,4,d,4)*4;sum=0;
	su+=RK(13,4,d,4)*6;sum=0;
	su+=RK(13,3,d,3)*3;sum=0;
	su+=RK(13,3,d,3)*6;sum=0;
	su+=RK(13,3,d,3);sum=0;
	su+=RK(13,2,d,2)*2;sum=0;
	su+=RK(13,2,d,2);
	printf("%d",su);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值