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
/***************************************************************\
*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]);
}
}
posted @ 2010-08-22 11:51  open source  阅读(192)  评论(1编辑  收藏