ZJNU 1153 - 找单词——中级
状态转移
b[i]记录价值为i的单词种类数
d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50
表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转移而来
最后统计即可
#include<stdio.h> int main(){ int T,t,i,j,k,a[27]={0},b[51],d[51],s; scanf("%d",&T); for(t=0;t<T;t++){ for(i=1;i<27;i++) scanf("%d",&a[i]); for(i=0;i<51;i++) b[i]=d[i]=0; b[0]=1; for(i=1;i<27;i++){ for(j=0;j<51;j++) for(k=0;k<=a[i]&&j+k*i<=50;k++) d[j+k*i]+=b[j]; for(j=0;j<51;j++){ b[j]=d[j]; d[j]=0; } } for(s=0,i=1;i<51;i++) s+=b[i]; printf("%d\n",s); } return 0; }