#include<stdio.h> #include<string.h> #include <windows.h> int c[45],s[45]; int a[8],b[8]; int main() { int T,i,j,t,n,k; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&k); memset(a,0,sizeof(a)); memset(s,0,sizeof(s)); for(i=0;i<k;i++) scanf("%d%d",&a[i],&b[i]); for(i=0;i<=n&&i<=a[0]*b[0];i+=a[0]) s[i]=1; //将第一组数据的系数全部初始化为1 for(i=1;i<k;i++) //i从1开始因为第一次性解决了两项,第二次直接从第三项开始 { for(j=0;j<=n&&j<=a[i-1]*b[i-1];j+=a[i-1]) //j+=a[i-1]为了减少一些不必要的计算||j<=a[i-1]*b[i-1] { for(t=0;t+j<=n&&t<=a[i]*b[i];t+=a[i]) c[j+t]+=s[j]; //j代表前一项的指数,t代表后一项的指数 c[j+t]+=s[j]表示两者相乘时的系数相加 } for(j=0;j<=n;j++) { s[j]=c[j]; c[j]=0; } } printf("%d\n",s[n]); } system("pause"); return 0; }
原文:https://www.cnblogs.com/z2529827226/p/11628846.html