Loading

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("");
    }
}

 

posted @ 2020-08-18 19:57  MQFLLY  阅读(114)  评论(0编辑  收藏  举报