题意是有k个物品, 每个物品b[i]个, 且每个物品重a[i], 求从这些物品中取出的物品总重为n的方案数, 典型的求解多重集组合数, 代码如下:
#include <algorithm> #include <cstring> #include <iostream> using namespace std; int n, k; int a[10], m[10]; //学分为a[i]的课有m[i]门 int c1[45], c2[45]; int main() { int T; cin>>T; while(T--) { cin>>n>>k; for(int i=1; i<=k; i++) cin>>a[i]>>m[i]; memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for(int i=0; i<=m[1]&&i<=40; i+=a[1]) c1[i]=1; for(int i=2; i<=k; i++) { for(int j=0; j<=40; j++) for(int kk=0; kk<=a[i]*m[i]; kk+=a[i]) if(j+kk<=40) c2[j+kk] += c1[j]; for(int j=0; j<=40; j++) c1[j]=c2[j], c2[j]=0; } cout<<c1[n]<<endl; } return 0; }