hdoj1521
Problem : 1521 ( 排列组合 ) Judge Status : Accepted
RunId : 2856508 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 2856508 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Sun 22 Aug 2010 09:47:05 AM CST
*File Name: main.cpp
*Description:组合问题。母函数,其实已经没有了母函数的样子,倒像是一个递推
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int m,n,A[12],B[12],C[12];
//*=======================*Main Program*=======================*//
using namespace std;
int main(){
//freopen("input","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d",A+i);//物品个数
}
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
for(int i=1;i<=n;i++){//第i件物品
for(int j=0;j<=m;j++){//总个数,指数
if(j!=0&&B[j]==0)//当B[j]是0时,表示没这种排列,于是便不能
//在此基础上再往下构建新排列了,当然j==0时是初始状态,应当放行。
continue;
for(int k=1;k<=A[i]&&j+k<=m;k++){//添加的物品个数,(也可以从0开始,下面是赋值)
int method=1;//能构建的排列数
for(int s=1;s<=k;s++){
method*=(j+s);
method/=s;
}
if(j)
C[j+k]+=method*B[j];//每一种能构建method种,共有method*B[j]
else//j==0时是特例
C[j+k]+=method;
}
}
for(int j=0;j<=m;j++){
B[j]+=C[j];//此处不是赋值,要加上去(如果上面从0开始,这里就是赋值)
C[j]=0;
}
}
printf("%d\n",B[m]);
}
}