#题解
题目大意 给你n种物品 每个物品的大小为v有2^c-1个 q次询问 问你当背包容量为s的时候有多少种可行方案
转换为多重背包问题求解 求解的时候计算方案数
#AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int MAXN = 30;
const int MAXS = 1e4 + 10;
int v[MAXN], c[MAXN];
ll d[MAXS];
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int T;
cin >> T;
while (T--)
{
memset(d, 0, sizeof(d));
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++)
scanf("%d%d", &v[i], &c[i]), c[i] = (1LL << c[i]) - 1;
d[0] = 1;
for (int i = 1; i <= n; i++) //物品
{
for (int j = 1; j <= c[i]; c[i] -= j, j <<= 1)
for (int k = 1e4; k >= v[i] * j; k--)
d[k] = (d[k] + d[k - v[i] * j]) % MOD;
if (c[i])
for (int k = 1e4; k >= v[i] * c[i]; k--)
d[k] = (d[k] + d[k - v[i] * c[i]]) % MOD;
}
for (int i = 0; i < q; i++)
{
int s;
scanf("%d", &s);
printf("%lld\n", d[s]);
}
}
return 0;
}