状态转移
b[i]记录价值为i的单词种类数
d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50
表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转移而来
最后统计即可
1 /* 2 Written By. StelaYuri 3 */ 4 #include<stdio.h> 5 int main(){ 6 int T,t,i,j,k,a[27]={0},b[51],d[51],s; 7 scanf("%d",&T); 8 for(t=0;t<T;t++){ 9 for(i=1;i<27;i++) 10 scanf("%d",&a[i]); 11 for(i=0;i<51;i++) 12 b[i]=d[i]=0; 13 b[0]=1; 14 for(i=1;i<27;i++){ 15 for(j=0;j<51;j++) 16 for(k=0;k<=a[i]&&j+k*i<=50;k++) 17 d[j+k*i]+=b[j]; 18 for(j=0;j<51;j++){ 19 b[j]=d[j]; 20 d[j]=0; 21 } 22 } 23 for(s=0,i=1;i<51;i++) 24 s+=b[i]; 25 printf("%d\n",s); 26 } 27 return 0; 28 }
原文:https://www.cnblogs.com/stelayuri/p/12213457.html