原题链接

题目大意:某人手上有一大批钻石,他同时有一些盒子恰好放下这些钻石,每个盒子可以放一个或多个,问一共有几种方法。

解法:这其实是一道排列与组合计算题,主要是写出组合算法的代码,把计算公式转为程序。

 

参考代码:

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