zoukankan      html  css  js  c++  java
  • 母函数的一些简单想法(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;
        }
    }
    不怕万人阻挡,只怕自己投降。
  • 相关阅读:
    扫描线算法
    [Baltic 2001]Mars Maps
    Lost Cow
    李超线段树
    多种方法求解Pku3468 A Simple Problem with Integers
    陈老师的福利
    leetcode 673. 最长递增子序列的个数
    #10043.「一本通 2.2 例 1」剪花布条
    PTA7-1
    6-1 实验三哈夫曼树 (15分)
  • 原文地址:https://www.cnblogs.com/newstartCY/p/11563395.html
Copyright © 2011-2022 走看看