hdu1521 排列组合(指数型母函数)
2015-08-10 16:18
176 查看
排列组合
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3098 Accepted Submission(s): 1275
Problem Description
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
Input
每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。
Output
对应每组数据输出排列数。(任何运算不会超出2^31的范围)
Sample Input
2 2 1 1
Sample Output
2
思路:排列组合题,可以使用指数型母函数。
#include<stdio.h> #include<string.h> int sum[55]; void cal() { sum[0]=1; sum[1]=1; for(int i=2;i<=20;i++) sum[i]=sum[i-1]*i; } //计算n! int main() { cal(); int i,j,k; double c1[55],c2[55]; int n,m,num[30]; while(~(scanf("%d%d",&n,&m))) { for(i=1;i<=n;i++) scanf("%d",&num[i]); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=0;i<=num[1];i++) { c1[i]=1.0/sum[i]; } for(i=2;i<=n;i++) { for(j=0;j<=m;j++) { for(k=0;k+j<=m&&k<=num[i];k++) c2[k+j]+=c1[j]/sum[k]; } for(j=0;j<=m;j++) { c1[j]=c2[j]; c2[j]=0; } } printf("%.0f\n",c1[m]*sum[m]); //注意指数型母函数的形式,最后得出答案时要乘上m! } return 0; }
相关文章推荐
- 关于推送,你可能忽略的那些事儿
- 一
- 一个简单的二叉查找树实现
- linux acl体验
- uva 215 Spreadsheet Calculator
- poj 1458/ hdu 1159 Common Subsequence
- 次小生成树模板
- C# 关键字
- nagios分布式部署详细文档
- iOS线程操作
- Linux 磁盘分区和文件系统
- javaScript中获取元素的id
- eclipse常用插件安装
- hdu 4101 Ali and Baba(bfs,dfs)
- ABAP中FOR ALL ENTRIEL IN
- Longest Valid Parentheses
- jQuery 图片轮播
- qt越来越好了
- webstrom 自动换行
- 编译安装python