题目大意:
Jack有一些钻石,这些钻石互不相同。他买了一个保险柜,这些保险柜除了容量不同,其他都相同。他想知道有多少种方法保存这些钻石。
输入包括两行,第一行包括一个整数N,代表保险柜的数量,第二行有N个整数,代表每个保险柜的容量,钻石总量等于这个保险柜容量之和。
解题思路:
其实就是高中的排列组合,比如第一组A6:3,同时因为保险柜除了容量不同,其他相同,所以要除以顺序。
代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int num;
int box[15];
int main()
{
int i;
int cap;
int max;
int sum;
int j;
int mul;
int key;
int box_num;
int sum_mul;
while(scanf("%d",&num)!=EOF)
{
max=0;
sum=0;
mul=1;
memset(box,0,sizeof(box));
for(i=1;i<=num;i++)
{
scanf("%d",&cap);
sum+=cap;
if(cap>max)
{
max=cap;
}
box[cap]++;
}
for(i=0;i<=max;i++)
{
box_num=box[i];
while(box[i]>=1)
{
key=sum;
for(j=1;j<=i;j++)
{
mul=key*mul;
key=key-1;
}
key=i;
for(j=1;j<=i;j++)
{
mul=mul/key;
key=key-1;
}
box[i]--;
sum=sum-i;
}
if(box_num>1)
{
sum_mul=1;
for(i=box_num;i>=1;i--)
{
sum_mul=sum_mul*i;
}
mul=mul/sum_mul;
}
}
printf("%d\n",mul);
}
return 0;
}