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