题目大意:
a,b,c,d...z这些字母的价值是1,2,3......26
给定 这26个字母分别的数量,求总价值不超过50的单词的数量
分析:
标准做法是构造母函数
把某个单词看作是,关于x的多项式,在这个多项式中
形如 a*x^b 这样的项就代表 价值为b的单词有a个。。
做法:
= =其实不知道母函数也完全可以做。。就是个很简单的dp嘛。。
代码:
#include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; #define MAXN 10000 int dp[30][60]; int a[30]; int main() { int t; scanf("%d",&t); while(t--) { for(int i=1;i<=26;i++) { scanf("%d",a+i); } memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=26;i++) { for(int j=0;j<=50;j++) { for(int k=0;k<=a[i];k++) { if(j-k*i<0) continue; dp[i][j]+=dp[i-1][j-k*i]; } } } int ans=0; for(int i=1;i<=50;i++) { ans+=dp[26][i]; } printf("%d ",ans); } return 0; }