比赛 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;
}