2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9
7 379297
#include <stdio.h> #include <string.h> int arr[51],tmp[51],num[27]; int main() { freopen("in.txt", "r", stdin); int t,i,j,k,ans; scanf("%d", &t); while(t--){ for(i=1; i<=26; i++) scanf("%d",&num[i]); memset(tmp,0,sizeof(tmp)); memset(arr,0,sizeof(arr)); for(i=0; i<= num[1]; i++) { arr[i] = 1; tmp[i] = 0; } for(i=2; i<=26; i++) // i就表示第i个字母,也是DP的应用 { if(num[i] == 0 ) continue; for(j=0; j<=50; j++) { for(k=0; k<= num[i] && k*i + j <= 50; k++) //k表示第j个指数。 { tmp[k*i + j] += arr[j]; // 第i个字母的价值也为i } } for(j=0; j<=50; j++) { arr[j] = tmp[j]; tmp[j] = 0; } } ans = 0; for(i=1; i<=50; i++) { ans += arr[i]; } printf("%d\n",ans); } return 0; }