题目链接:点击这里
解题思路:
对于i种物品有2^(c[i])-1个,将个数二进制压缩,原理就跟二进制数可以组成任意数值是一样的,而且由于二进制成倍增长,肯定不会有重复,如果还不懂可以去学习多重背包.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int mx = 1e4 + 10;
int v[25], c[25];
int n, q;
ll dp[mx];
void init();
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &q);
for(int i = 1; i <= n; i++){
scanf("%d %d", &v[i], &c[i]);
}
///init();
memset(dp,0,sizeof(dp));
dp[0] = 1;
int s;
for(int i=1;i<=n;i++){
for(int j=0;j<c[i];j++){
int u = (1<<j)*v[i];
for(int k=mx-1;k>=u;k--){
dp[k] = (dp[k]+dp[k-u])%mod;
}
}
}
while(q--){
scanf("%d", &s);
printf("%lld\n",dp[s]);
}
}
}