1、Hdu 2082 找单词
题意:单词A-Z具有1-26的价值,现有字母A-Z的个数num[i],求问在不超过价值为五十的情况下,有多少种字母的组合数.
思路:用指数代表价值,价值又为数组的下标;用系数代表组成该价值的方案数,方案数为数组中存的值。
1 #include<iostream> 2 #include<memory.h> 3 using namespace std; 4 int re[55]; 5 int p1[55]; 6 int p2[55]; 7 int xx[27]; 8 int main() 9 { 10 int t; 11 scanf("%d", &t); 12 while (t--) 13 { 14 for (int i = 1; i <= 26; i++) scanf("%d", &xx[i]); 15 for (int i = 0; i <= 50; i++) 16 { 17 if (i <= xx[1]) p1[i]= 1; 18 else p1[i] =0; 19 re[i]=p2[i] = 0; 20 } 21 22 for (int i = 2; i <= 26; i++) 23 { 24 for (int k = 0; k <= xx[i] && k*i <= 50; k++) p2[k*i] = 1; 25 for (int j = 0; j <=50; j++) 26 { 27 for (int k = 0; k <= xx[i]; k++) 28 {//第i个字符的多项式,每项的指数为i*k,系数为1 29 int zhishu = i*k+j; 30 if (zhishu > 50) continue; 31 re[zhishu] += p1[j]*p2[k*i]; 32 } 33 } 34 for (int j = 0; j <= 50; j++) p1[j]=re[j],re[j]=p2[j]=0; 35 } 36 int sum = 0; 37 for (int i = 1; i <= 50; i++) sum += p1[i]; 38 printf("%d\n", sum); 39 } 40 return 0; 41 }