HDU - 2082 找单词 生成函数
每个字母都有价值,A的价值是1,B的价值是2,Z的价值是26。现给定26个字母的数量,问能凑到总价值<=50的单词的方案数是多少。
注意HDU , UDH属于相同的单词。
形式上,普通型母函数用于解决多重集的组合问题,
指数型母函数用于解决多重集的排列问题。
此题用普通型母函数求解。
构造母函数
于是遍历的过程中注意以下k <= x && (j + k * i ) <= 50 即可。
最后对c1[1 -50] 累加就是答案。
ll c1[55], c2[55]; int main() { int T = readint(); while (T--) { memset(c1, 0, sizeof c1); memset(c2, 0, sizeof c2); c1[0] = 1ll; int x; for (int i = 1; i <= 26; i++) { x = readint(); for (int j = 0; j <= 50; j++) for (int k = 0; k <= x && (j + k * i) <= 50; k++) c2[j + k * i] += c1[j]; for (int j = 0; j <= 50; j++) c1[j] = c2[j], c2[j] = 0; } ll res = 0; for (int i = 1; i <= 50; i++) res += c1[i]; Put(res); puts(""); } }