HDU_1521

    第一次做这种不能转化成类似e^x形式的指数生成函数的题目,一开始愣住了,还以为要想办法用整数分式来表示中间结果,后来发现只要用double处理就可以了。

#include<stdio.h>
#include<string.h>
#define MAXD 15
int N, M, a[MAXD];
double f[MAXD][MAXD], fac[MAXD];
void prepare()
{
int i, j, k;
fac[0] = 1;
for(i = 1; i <= 10; i ++)
fac[i] = i * fac[i - 1];
}
void solve()
{
int i, j, k;
for(i = 1; i <= N; i ++)
scanf("%d", &a[i]);
memset(f, 0, sizeof(f));
f[0][0] = 1;
for(i = 1; i <= N; i ++)
for(j = 0; j <= a[i]; j ++)
for(k = 0; k + j <= M; k ++)
f[i][k + j] += f[i - 1][k] / fac[j];
printf("%.0lf\n", f[N][M] * fac[M]);
}
int main()
{
prepare();
while(scanf("%d%d", &N, &M) == 2)
{
solve();
}
return 0;
}


posted on 2012-03-06 02:33  Staginner  阅读(457)  评论(0编辑  收藏  举报