zoukankan      html  css  js  c++  java
  • ZOJ 1202 Divide and Count

    原题链接

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

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

    参考代码:

    #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;
    }
    
    
  • 相关阅读:
    微服务配合docker使用
    基于docker部署使用ELK+FileBeat日志管理平台
    Ubuntu开发用新机安装流程
    http 直接从body里传输数据
    005
    003
    004
    001
    002
    谷歌查看、管理cookie
  • 原文地址:https://www.cnblogs.com/naive/p/3568806.html
Copyright © 2011-2022 走看看