Q - 统计硬币 HDU - 2566(母函数)

Q - 统计硬币

HDU - 2566

假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。

Input

输入数据第一行有一个正整数T,表示有T组测试数据;
接下来的T行,每行有两个数n,m,n和m的含义同上。

Output

对于每组测试数据,请输出可能的组合方式数;
每组输出占一行。

Sample Input

2
3 5
4 8

Sample Output

1
2
#include<cstdio>
#include<stack>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<iostream>
#include<cmath>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int N=111;
const int mmax=11111;
const int MOD = 1e5+ 7;
int val[N]={1,2,5};
int num[N];
int a[mmax][N],t[mmax][N];   //一维下标表示总面值,二维下标表示硬币数。
int main()
{
    int n,m;
    int c;
    cin>>c;
    while( c--)
    {
        cin>>n>>m;
        memset(a,0,sizeof(a));
        memset(t,0,sizeof(t));
        a[0][0]=1;
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<=m; j++)
            {
                if(a[j])
                {
                    for(int k=0; j+k*val[i]<=m; k++)
                    {
                        for(int r=0;r+k<=n;r++)
                        t[j+k*val[i]][r+k]+=a[j][r];
                    }
                }
            }
            memcpy(a,t,sizeof(a));
            memset(t,0,sizeof(t));
        }
        cout<<a[m][n]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/clz16251102113/article/details/81215535