54张牌分给4人有多少种分法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了54张牌分给4人有多少种分法?相关的知识,希望对你有一定的参考价值。

54张牌分给4人有多少种分法?

一副牌共54张,每张都不同。分给4个不同的人,每人都必须分到至少1张。

问:一共有多少种不同的分法?
(答案要求精确到个位数)

可以参考第二类斯特林数的公式来计算,具体公式证明可在百度上搜索一下,结果如附图所示(图中的k应改为m):

追问

有道理。

我今早通过递归分析,也找到了具体算法。具体实现用了顺向循环,实际过程是等效的。

可否再请教一个问题:

各位数字之和为5000的1000位正整数有多少个?

这个题目,用枚举肯定无法解决。我用了动态规划算法,耗时80分钟。

有没有数学方法可以直接或者快速地计算出答案。

谢谢!

动态规划算法的结果见下图:

追答

如果是用计算机编程计算的话用递推算法最简单。
设数字总和为s,位数为d,个数为f(s,d)
则有:
f(s,d)=f(s,d-1)+f(s-1,d-1)+…+f(s-9,d-1)

时间和空间复杂度:O(s*d)

追问

目前用的就是这个算法,动态规划。

因为用到大整数计算,定义f数组的规模超出了编译器限制,只能动用硬盘或内存虚拟盘来暂存。所以,计算时间很长。

500位的话,只需要几秒钟。1000位就要几十分钟。

参考技术A 这个54张牌分给四个人就是有两种分法。因为这个评论不了,所以必须有两个人牌多,有两个人牌少。也就是给前两个人每人14张牌,后两位每人13张牌。再就是给后者两人每人14张牌,前者每人13张牌 参考技术B 微风吹开你紧琐的眉头,春雨滋润你僵硬的面容,让所有的愁向后飞去。请不要回头去追那些不属于你的忧愁,赶快向前奔跑,因为快乐就在前方! 参考技术C 可以参考第二类斯特林数的公式来计算,具体公式证明可在百度上搜索一下,结果如附图所示(图中的k应改为m): 参考技术D C(53,3)×A(4,4)=53×52×51÷3÷2÷1×4×3×2×1=562224种分法
提示:54张牌排成一排,中间有53个间隔(因为每人至少有1张,故牌前后的间隔不可用.),选择3个间隔,可以分成4份,然后乘以A(4,4)即可!追问

题意是:一副牌共54张,每张都不同。插板法适用的是,每个元素都相同的情形!
编程可得总方案数为 324518321059478822709308315907480。
有没有更直接的数学方法?谢谢!

追答

回答有误!请见谅!
那应该在分法采用步步分的办法,即分法为1,1,1,51时,就
C(54,1)×C(53,1)×C(52,1)=148824种;1,1,2,50时,有C(54,1)×C(53,1)×C(52,2)=?;1,1,3,49;1,1,4,48;这样的分法就有51种(没有加各种分法的结果,也没有乘以A(4,4))…还有2,2,1,49;2,2,2,48;有49种分法…3,3,1,47;3,3,2,46;有47种分法…
这样计算太麻烦了,而且数值大!

追问

一共有1154个分类

追答

每个分类,还需要计算.每个分类计算的结果也不同…

98 数的划分

98 数的划分

作者: Turbo时间限制: 1S章节: 动态规划

问题描述 :

  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  1,1,5; 1,5,1; 5,1,1;
  问有多少种不同的分法。

样例输入

7 3

样例输出

4 {四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3;}

输入说明 :

两个整数n和k

6<n<=200,2<=k<=6

输出说明 :

一个整数,即不同的分法

输入范例 :
7 3
输出范例 :
4

dp:
分两种情况 1, 至少一个盒子只有一个球的个数 2,没有一个盒子只有一个球
这样进行划分的原因是这种分类足够特殊,1和2都有可以写出来的表达式:

  1. 因为盒子不加区分,那么1的情况数与“将n-1个小球放到k-1个盒子中”的情况数一样
  2. 没有一个盒子只有一个小球,那么把每个盒子中拿出来一个小球,对应的是“把(n-k)个小球放到k个盒子中的情况数”
    至于1和2中的两种等价关系为什么成立,可以用集合A=集合B的方式去证明
#include <iostream>
using namespace std;
int main()
{
	int n, k;
	cin >> n >> k;
	int dp[201][201] = { 0 };
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			if (i == j)
				dp[i][j] = 1;
			else
				dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];
		}
	}
	cout << dp[n][k] << endl;
	return 0;
}

dfs:

#include <iostream>
using namespace std;
int n, m,num=0;
void dfs(int k, int sum, int index)
{
	if (index == m)
	{
		if (sum == n)
			num++;
		return;
	}
	for (int i = k; sum + i*(m - index) <= n; i++)//剪枝
	{
		dfs(i, sum + i, index + 1);
	}
}
int main()
{
	cin >> n >> m;
	dfs(1, 0, 0);
	cout << num << endl;
	return 0;
}









以上是关于54张牌分给4人有多少种分法?的主要内容,如果未能解决你的问题,请参考以下文章

用C语言写:36个数字平均分成4组(每组九个数字)有多少种分法,并显示分组

用java将一个正整数拆分成若干个正整数的和,问有多少种分法?

将168枚月饼平均分成若干盒,每盒可放3到8枚有多少种分法?

用java将一个正整数拆分成若干个正整数的和,问有多少种分法?

D: Divide the pears

数的划分