HDU -- 2069 Coin Change 【母函数进阶】

传送门
//这道题其实也是母函数的简单应用, 大不了增加了硬币数量限制, 总的数量不能超过100枚.
//那我们就在原先的基础上增加一维用来表示所用硬币的数量. 这样再循环时我们增加一个循环判断数量是否在限制范围内就行了.

/** @Cain*/
const int maxn = 1e3+5;
int s[10] = {0,1,5,10,25,50};

int a[maxn][105],b[maxn][105];  //因为有数量限制, 所以需要增加一维来表示用了的数量.
//dp[i][j] 代表当前克所用的数量的系数.
void solve()
{
    int n;
    while(~scanf("%d",&n)){
        Fill(a,0); Fill(b,0);
        for(int i=0;i<=n && i<=100;i++) a[i][i] = 1;

        for(int i=2;i<=5;i++){
            for(int j=0;j<=n;j++){
                for(int k=0; k+j <= n; k+=s[i]){
                    for(int h=0; h + (k+j)/s[i] <= 100 ; h++){   //多讨论一下数量限制就行了.
                        b[k+j][h+(k+j)/s[i]] += a[j][h+j/s[i]];
                    }
                }
            }
            memcpy(a,b,sizeof(a));
            Fill(b,0);
        }

        ll res = 0;
        for(int i=0;i<=100;i++) res += a[n][i];  //分别把用几个硬币可以构成目标值的方案加起来.
        printf("%lld\n",res);
    }
}

你可能感兴趣的:(母函数)