例题链接:HDU2082:https://vjudge.net/problem/HDU-2082

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int a[100]; //对应价值的系数
int b[100]; //当有系数要跟新时,用b数组进行暂时储存

//解题思路:母函数,用指数代表价值,价值又为数组的下标,用系数代表组成该价值的方案组,方案组为数组中存的值
//价值不大于50!!!!!!,求x50次幂前的系数和就可以了

void init()
{
    for (int i=0;i<=50;i++)
    {
        a[i]=0;
        b[i]=0;
    }
}

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        init();   //初始化,使a,b数组均等于0
        a[0]=1;
        int num;

        for (int i=1;i<=26;i++) //一共26个变量,(i代表价值)如果num==0,直接continue
        {
            cin >> num;
            if(num==0) continue;
            for (int j=0;j<=50;j++) // j就是前面i个表达式累乘得到的表达式里第j个变量 -》 1 + a[1]x^1 + a[2]x^2 + a[3]x^3 + a[4]x^4 ~~~~ a[50]x^50
            {
                for (int k=0; k<=num && k*i+j<=50; k++) //k表示的是第j个指数,所以k每次增i
                {
                    b[k*i+j]+=a[j];
                }
            }
            for (int j=0;j<=50;j++)
            {
                a[j]=b[j]; //这里一定要注意,是=,不是+=,因为新的多项式跟新后,原来的多项式的系数就没了(新的多项式系数是1)
                b[j]=0;
            }
        }

        int ans=0;
        for (int i=1;i<=50;i++)
        {
            ans+=a[i]; //当价值(i)在1~50时,加上前面的系数(个数)
        }
        cout << ans << endl;
    }
    return 0;
}