您的位置:首页 > 其它

HDU 1521 排列组合

2011-06-11 13:26 246 查看
#include <iostream>
using namespace std;
double facots[]={1,1,2,6,24,120,720,5040,40320,362880,3628800};
/*求排列数的母函数。
ans=m!/(n1!*n2!*n3!……*nk!)
m
其中∑ nk =m ,因为刚好选定m件物品。
k=1
意思就是同一种物品无论怎么排列都只算做一种,所以当选某一件物品k次时就要 除以k!
例如某一堆有3件物品 现在要取2件,那么排列数为2!,而事实上它2!种都是相同的,这也就是所谓的分组排列
*/
int main(){
int n,m;
while(cin>>n>>m){
double num[11],c2[11]={0},c1[11]={0};
int i,j,k;
for(i=0;i<n;i++)
cin>>num[i];
for(i=0;i<=num[0];i++)
c1[i]=1.0/facots[i]; //一种哈希计数,这里是母函数值的入口
for(i=1;i<n;i++){
for(j=0;j<=m;j++) //前种物品
for(k=0;k<=num[i] && k+j<=m;k++)
c2[j+k]+=(c1[j]/facots[k]); //更新后一种物品,取了k件物品所以除以k!
for(j=0;j<=m;j++)
c1[j]=c2[j],c2[j]=0;
}
double p=c1[m]*1.0*facots[m];//还原原来的系数
printf("%.0lf/n",p);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: