ACM组队安排 (DFS+计数原理)
来源:互联网 发布:网络分销平台排行 编辑:程序博客网 时间:2024/06/01 08:16
题意:将N (N<=20 )个人分成若干组,每组至少1人,至多3人,组不编号。问有多少种分组方案。
题解:将N 拆分成若干个 1,2,3 相加,每个因子作为 每组的人数。
如 5= 1+1+1+1+1 = 1+1+1+2 = 1+1+3 = 1+2+2 = 2+3 ; 累加每种情况的的分组方案即可。
计数公式
将N个有区别元素 均分M份,每份k个 即(N/M).
方案数:CkNCkN−kCkN−2k⋯Ckk/AMM
故 13 = 1+2+2+2+3+3 该情况有C113C212C210C28C36C33/A11/A33/A22
DFS所有情况,累计方案数。
还有一种更简单的递推方式解法,比赛的时候没想出来,果然思维还是受限了。
第n个人可以从前n-1个人中选出0个人组队,则方法有f[n-1]种;
可以从前n-1个人中选出一个人组队,则有n-1种选法,剩下的n-2个人有f[n-2]种组法;
可以从前n-1人中选出2两个人组队,则有n-2种选法,剩下的n-3个人有f[n-3[种组法;
递推公式为f[n] = f[n-1] + (n-1)f[n-2] + (n-1)(n-2)/2 * f[n-3];
贴上第一种方法
#include<iostream>#include<stdio.h>#include<queue>#include<math.h>#include<string.h>#include<string>#include<stdlib.h>#include<algorithm>using namespace std;typedef __int64 LL;LL A[22]; LL Ans[22];LL cal(LL a,LL b){ LL num1=1,num2=1; for(LL i=1;i<=b;i++){ num1*=i; num2*=(a+1-i); } return num2/num1;}void cal1(){ A[0]=1; A[1]=1; for(LL i=2;i<=20;i++){ A[i]=A[i-1]*i; }}/* Key: N个人 N: 未分配人数 pre: 上次分配人数,确保分解和因子非递减 a,b,c: 分别为1,2,3个人组成的组数 ans:计数公式中的分子*/void DFS(int Key,LL N,LL pre,LL a,LL b,LL c,LL ans){ if(N==0) { Ans[Key]+=(ans/A[a]/A[b]/A[c]); return; } for(LL i=pre;N>=i&&i<=3;i++){ if(i==1) DFS(Key,N-i,i,a+1,b,c,ans*cal(N,i)); else if(i==2) DFS(Key,N-i,i,a,b+1,c,ans*cal(N,i)); else if(i==3) DFS(Key,N-i,i,a,b,c+1,ans*cal(N,i)); }}void solve(){ for(int i=1;i<=20;i++){ Ans[i]=0; DFS(i,(LL)i,1,0,0,0,1); }}int main(){ LL N; cal1(); solve(); while(scanf("%I64d",&N)&&N!=0){ printf("%I64d\n",Ans[N]); }}
0 0
- ACM组队安排 (DFS+计数原理)
- 杭电校赛(ACM组队安排)
- ACM组队安排
- hdu ACM组队安排
- hdu 校赛 ACM组队安排 (递推)
- HDU-计算机学院大学生程序设计竞赛(2015’11)1005 ACM组队安排(排列组合)
- HDU15年新生赛 1005 ACM组队安排(DP+组合公式)
- 计算机学院大学生程序设计竞赛(2015’11)1005 ACM组队安排
- HDU ACM组队安排 [基础DP+打表]
- HDU-新生赛-ACM组队安排【递推】
- 杭电 2015’11校赛 1005ACM组队安排
- BNUOJ 51280 组队活动(dp + 计数)
- 2015杭电新生赛1005ACM组队安排【排列组合】【智商题】
- ACM 组队经验谈
- ACM 组队记
- ACM 组队经验谈
- ACM组队经验谈
- ACM 组队经验谈
- Java基础---图形用户界面GUI(一)
- 地理信息系统基础算法(一)判断点在线段上
- CSS HACK 兼容列表 Firefox, IE5, IE5.5, IE6, IE7, IE8
- 数据字节编码DBA--30
- 《代码整洁之道》-- 写代码时需要注意的命名技巧
- ACM组队安排 (DFS+计数原理)
- 一个简单的表单验证JS
- 用MySQL创建数据库表
- C#拆箱与装箱
- 模块、过程和变量
- -bash:vim command not found
- Toolbar的简单介绍和如何简单自定义toolbar
- 操作系统概念 管程Java代码实现
- Codeforces Educational Codeforces Round 2 A. Extract Numbers