01背包问题,开始有点犹豫能不能拿同一样物品,觉得有点复杂。后来发现可以拿同一件物。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1010;
int w[maxn],val[maxn],dp[maxn];
int g[105];
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
int n,m;
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d %d",&val[i],&w[i]);
scanf("%d",&m);
for(int i=1; i<=m; ++i) scanf("%d",&g[i]);
int sum = 0;
for(int i=1; i<=m; ++i){
memset(dp,0,sizeof(dp));
for(int k=1; k<=n; ++k)
for(int j=g[i]; j>=w[k]; --j)
dp[j] = max(dp[j-w[k]]+val[k],dp[j]);
sum += dp[g[i]];
}
printf("%d\n",sum);
}
return 0;
}