Q - 统计硬币
假设一堆由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;
}