版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Masqueradey/article/details/52549044
这道题可以用母函数做也可以直接暴力求解,但是本人母函数不熟悉,所以还是做做母函数的题目练练手吧。
代码:
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 500
int c1[maxn][maxn],c2[maxn][maxn];//注意,因为题目对硬币数量进行了要求,所以利用二维数组的第二维来储存信息,第一维储存价值,第二维储存硬币个数
int b[4];
int main(){
int i,j,k,kk,sum;
int T,n,m;
b[1]=1;
b[2]=2;
b[3]=5;
cin>>T;
while(T--){
sum=0;
cin>>n>>m;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
/* for(i=0;i<=n;i++)
{
c1[i][i]=1;
}*/
c1[0][0]=1;
for(i=1;i<=3;i++)
{
for(j=0;j<=m;j++)
for(k=0;k+j<=m;k+=b[i])
{
for(kk=0;kk+k/b[i]<=n;kk++)
c2[k+j][kk+k/b[i]]+=c1[j][kk];
}
for(j=0;j<=m;j++)
{
for(k=0;k<=n;k++)
{c1[j][k]=c2[j][k];c2[j][k]=0;}
}
}
cout<<c1[m][n]<<endl;
}
return 0;
}