#include<stdio.h>
#include<string.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int w[12][120],num[12],sum[12];
int dp[11000];
int main()
{
char s2[100][100],s1[100];
int n,m,x;
while(~scanf("%d%d",&n,&m)&&(n+m))
{
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
scanf("%s",s2[i]);
for(int i=0;i<m;i++)
{
scanf("%d %s",&x,s1);
for(int j=0;j<n;j++)
{
if(strcmp(s2[j],s1)==0)
{
w[j][num[j]]=x;
num[j]++;
sum[j]+=x;
break;
}
}
}
int res=0;
for(int i=0;i<n;i++)
{
memset(dp,0,sizeof(dp));
int col=sum[i]/2;
for(int j=0;j<num[i];j++)
{
for(int k=col;k>=w[i][j];k--)
dp[k]=MAX(dp[k],dp[k-w[i][j]]+w[i][j]);
}
res+=(sum[i]-dp[col]);
}
printf("%d\n",res);
}
}
poj 3211 背包
最新推荐文章于 2021-05-16 21:17:17 发布