zoj1202

来源:互联网 发布:服装零售进销存软件 编辑:程序博客网 时间:2024/05/17 21:06

题目大意:

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;}
0 0
原创粉丝点击