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的情况数与“将n-1个小球放到k-1个盒子中”的情况数一样
- 没有一个盒子只有一个小球,那么把每个盒子中拿出来一个小球,对应的是“把(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枚有多少种分法?