比赛 |
20101118 |
评测结果 |
AAAAAAAAWA |
题目名称 |
情敌 |
最终得分 |
90 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2010-11-18 09:38:16 |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
using namespace std;
int f[101][101];
int g[101][101];
int a,b,n,m,ans;
int dep[51];
int v[51],w[51];
int main()
{
freopen("rival.in","r",stdin);
freopen("rival.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&n,&m);
b/=2;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&v[i],&w[i]);
ans+=v[i];
}
int t1,t2,t3;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
dep[t1]=-1;
for (int i=1;i<=t2;i++)
scanf("%d",&t3),dep[t3]=t1;
}
for (int i=1;i<=n;i++)
{
if (dep[i]==0)
{
for (int j=a;j>=0;j--)
for (int k=b;k>=0;k--)
{
if (j-w[i]>=0) f[j][k]=max(f[j][k],f[j-w[i]][k]+v[i]);
if (k-w[i]>=0) f[j][k]=max(f[j][k],f[j][k-w[i]]+v[i]);
}
}
if (dep[i]==-1)
{
memset(g,0,sizeof(g));
for (int ii=1;ii<=n;ii++)
if (dep[ii]==i)
{
for (int j=a;j>=0;j--)
for (int k=b;k>=0;k--)
{
if (j-w[ii]>=0) g[j][k]=max(g[j][k],g[j-w[ii]][k]+v[ii]);
if (k-w[ii]>=0) g[j][k]=max(g[j][k],g[j][k-w[ii]]+v[ii]);
}
}
for (int j=a;j>=0;j--)
for (int k=b;k>=0;k--)
{
if (j-w[i]>=0) g[j][k]=g[j-w[i]][k]+v[i];
if (k-w[i]>=0) g[j][k]=g[j][k-w[i]]+v[i];
if (j-w[i]<0 && k-w[i]<0) g[j][k]=0;
}
for (int j=a;j>=0;j--)
for (int k=b;k>=0;k--)
for (int jj=j;jj>=0;jj--)
for (int kk=k;kk>=0;kk--)
{
f[j][k]=max(f[j][k],f[j-jj][k-kk]+g[jj][kk]);
}
}
}
printf("%d\n",ans-f[a][b]);
return 0;
}