其实就是一个重复10背包,刚开始把题意理解错了,后来敲了一发代码,不过样例分析了一下样例才得出正确题意。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#define LL long long
using namespace std;
const int maxn=1e3+10;
const double eps=1e-6;
//const int MAX_INT=(1<<31)-1;
int n,g;
struct ob{
int v,w;
}obj[maxn];
int cmp(ob x,ob y)
{
if(x.w==y.w)
return x.v>y.v;
else
return x.w<y.w;
}
int a[110];
int dp[110];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>obj[i].v>>obj[i].w;
cin>>g;
for(int i=0;i<g;i++)
cin>>a[i];
int ans=0;
for(int i=0;i<g;i++)
{
memset(dp,0,sizeof(dp));
for(int j=0;j<n;j++)
{
for(int k=a[i];k>=obj[j].w;k--)
dp[k]=max(dp[k],dp[k-obj[j].w]+obj[j].v);
}
ans+=dp[a[i]];
}
cout<<ans<<endl;
}
return 0;
}