题目大意:某人手上有一大批钻石,他同时有一些盒子恰好放下这些钻石,每个盒子可以放一个或多个,问一共有几种方法。
解法:这其实是一道排列与组合计算题,主要是写出组合算法的代码,把计算公式转为程序。
参考代码:
#include<iostream> #include<math.h> #include<string.h> #include<algorithm> using namespace std; int fact(int a){ //recursive factorial function if(a==1) return a; else return a*fact(a-1); } int main(){ int i,j,k,m,n,c,c1,c2,sum,ans; int num[15]; while(cin>>n&&n>0){ sum=0; ans=1; memset(num,0,sizeof(num)); for(i=0;i<n;i++){ cin>>m; sum+=m; num[m]++; } for(i=1;i<13;i++){ k=num[i]; c=1; while(k--){ c1=1; //calculate Combination for(j=sum;j>sum-i;j--) c1*=j; c2=1; for(j=i;j>0;j--) c2*=j; sum-=i; c*=c1/c2; } if(num[i]){ c/=fact(num[i]); //divide by the number of coffers which have same cap. ans*=c; } } cout<<ans<<endl; } return 0; }