看着很吊的样子,其实就是多个01背包而已,题目唬人呢
#include <iostream>
#include <cstring>
using namespace std;
int dp[101][31];
int v[1001];
int w[1001];
int mw[101];
int mark[101];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int r;
cin>>r;
while (r--)
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
cin>>v[i]>>w[i];
int g;
cin>>g;
memset (dp,0,sizeof(dp));
for (int i=1;i<=g;i++)
cin>>mw[i];
for (int i=1;i<=g;i++)
{
for (int t=1;t<=n;t++)
{
for (int k=mw[i];k>=w[t];k--)
{
dp[i][k]=max(dp[i][k],max(dp[i][k-w[t]]+v[t],dp[i][k-1]));
//cout<<dp[i][k]<<" "<<w[t]<<endl;
}
}
}
int sum=0;
for (int i=1;i<=g;i++)
{
sum+=dp[i][mw[i]];
//cout<<dp[i][mw[i]]<<endl;;
}
cout<<sum<<endl;
}
return 0;
}