HDU 1521 排列组合

#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; }

你可能感兴趣的:(HDU 1521 排列组合)