题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1521
思路
和上一道HDU 1028一样,都是用暴力做多项式乘法。但是上一题用到的是普通型母函数,而此题用的是指数型母函数。
对于此题可以建立这样的模型:有
n
种硬币,每种硬币个数为
构造
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 51000
using namespace std;
double c1[MAXN],c2[MAXN];
double fact[MAXN];
int num[MAXN],money[MAXN];
int main()
{
int n,m;
fact[0]=fact[1]=1;
for(int i=2;i<MAXN;i++) fact[i]=fact[i-1]*i;
while(scanf("%d%d",&n,&m)!=EOF)
{
int max=0;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
for(int i=1;i<=n;i++) money[i]=1;
c1[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=max;j++)
for(int k=0;k<=num[i];k++)
c2[j+k*money[i]]+=c1[j]/fact[k];
memcpy(c1,c2,sizeof(c2));
memset(c2,0,sizeof(c2));
max+=num[i]*money[i];
}
printf("%d\n",(int)(c1[m]*fact[m]+0.5));
}
return 0;
}