母函数的一些简单想法(HDU2110)

// 母函数解决的问题
// n 种物品,每个有一个wi,组合成total价值有多少种组合方案
// 将组合问题转换为 幂级数上的相乘问题(important) (Orz)
// #include<iostream>
// #include<cstdio>
// #include<cstring>
// using namespace std;
// int n,a[105],b[105],m,s[10010],t[10010];
// int main()
// {
//     while(~scanf("%d",&n),n)
//     {
//         m=0;
//         for(int i=0; i<n; i++)
//         {
//             scanf("%d%d",&a[i],&b[i]);
//             m+=(a[i]*b[i]);
//         }
//         if(m%3!=0)
//         {
//             printf("sorry
");
//             continue;
//         }
//         memset(s,0,sizeof(s));
//         memset(t,0,sizeof(t));
//         m/=3;
//         for(int i=0; i<=b[0]&&i*a[0]<=m; i++)
//         {
//             s[i*a[0]]=1;
//         }
//         for(int i=1; i<n; i++)
//         {
//             for(int j=0; j<=m; j++)
//                 for(int k=0; k<=b[i]&&k*a[i]+j<=m; k++)
//                 {
//                     t[k*a[i]+j]+=s[j];
//                     t[k*a[i]+j]%=10000;
//                 }
//                 for(int j=0; j<=m; j++)
//                 {
//                     s[j]=t[j];
//                     t[j]=0;
//                 }
//         }
//         if(s[m]!=0)
//         {
//             printf("%d
",s[m]);
//         }
//         else printf("sorry
");
//     }
//     return 0;
// }
//母函数训练    2019/9/22   13:36
#include<iostream>
#include<cstdio>
#include<cstring>//HDU 1398 附上一些最近母函数做的水题(hahaha)
using namespace std;//1 4 9 16 25 36 49 ... 289
const int maxn = 300 + 15;
const int coin[] = {1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289};
int sup[maxn],tmp[maxn];//sup数组内的为系数
int PF(int n)
{
    memset(sup,0,sizeof(sup));
    memset(tmp,0,sizeof(tmp));
    for(int i=0;i<=n;++i)
        sup[i] = 1;//因为有价值为1的coin存在
    for(int k=1,j=coin[k];j<=n;++k,j=coin[k])//枚举除第一枚coin外的其他硬币
    {//对每一枚硬币的value
        //cout<<k<<endl;
        for(int i=0;i<=n;++i)
        {//对于多项式每一项
            for(int l=0;l+i<=n;l+=j)
            {
                tmp[i+l] += sup[i];
            }
        }
        for(int i=0;i<=n;++i)
        {
            sup[i] = tmp[i];
            tmp[i] = 0;
        }
    }
    return sup[n];
}//母函数
int main()
{
    int n;
    while(cin>>n&&n)
    {
        cout<<PF(n)<<endl;
    }
}
不怕万人阻挡,只怕自己投降。
原文地址:https://www.cnblogs.com/newstartCY/p/11563395.html