本题母函数和DP都可以AC 下面我们来说说DP的思路
首先开一个num数组存放每个字母的个数 开一个二维DP[i][j]数组来存存放前i个字母可以组成价值为j的方法数(重点!!)
最后我们只需要把i==26时候的每一列加起来就是总的方法数
下面贴代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <stdlib.h>
using namespace std;
int num[27],N,DP[27][51];
int main()
{
ios::sync_with_stdio(false);
cin>>N;
while(N--)
{ int ans=0;
memset(num,0,sizeof(num));
memset(DP,0,sizeof(DP));
DP[0][0]=1;
for(int i=1;i<=26;i++)
{
cin>>num[i];
DP[i][0]=1;
}
for(int i=1;i<=26;i++)
for(int j=1;j<=50;j++)
{
for(int k=0;k<=num[i];k++)
{
if(j>=k*i)
DP[i][j]=DP[i-1][j-i*k]+DP[i][j];
}
if(i==26) ans=ans+DP[i][j];
}
cout<<ans<<endl;
}
return 0;
}