1. 程式人生 > 實用技巧 >HDU - 2082 找單詞 生成函式

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