暴力过 注意细节
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#define S(s) ((string)s)
using namespace std;
const int m_max=1000;
const int inf=-(1<<30);
int nperson[4];
int person[4][50];
int v[50];
int needperson[]={4,4,2,1};
int last[4],did[4];
int cap[m_max][3];
int ans,cnt,m;
char position[]="dmsg";
char str1[50],str2[50];
bool vis[50];
int stand[]={0,4,5,6,7,10,14,15,17,20,21};
void init()
{
memset(nperson,0,sizeof(nperson));
memset(last,0,sizeof(last));
memset(did,0,sizeof(did));
memset(cap,0,sizeof(cap));
memset(vis,0,sizeof(vis));
cnt=0;
ans=inf; //ans可能为负
}
void addperson(char *s2,int score)
{
v[cnt]=score;
for(int i=0;i<4;i++)
{
if(s2[0]==position[i])
{
person[i][ nperson[i] ++]=cnt++;
last[i]++;
break;
}
}
}
void bfs(int type,int p)
{
if(type==4)
{
int i;
int sum=0;
for(i=0;i<23;i++)
{
if(vis[i])
{
sum+=v[i];
}
}
for(i=0;i<m;i++)
{
if(vis[cap[i][0]]&&vis[cap[i][1]])
{
sum+=cap[i][2];
}
}
if(ans<sum)
{
ans=sum;
}
return ;
}
if(did[type]==needperson[type])
{
bfs(type+1,0);
return ;
}
int i;
for(i=p;i<nperson[type];i++)
{
vis[person[type][i]]=true;
did[type]++;
bfs(type,i+1);
vis[person[type][i]]=false;
did[type]--;
}
}
int main()
{
int score;
while(~scanf("%s%d%s",str1,&score,str2))
{
init();
map<string,int> name;
name[S(str1)]=cnt;
addperson(str2,score);
int i;
for(i=0;i<22;i++)
{
scanf("%s%d%s",str1,&score,str2);
name[S(str1)]=cnt;
addperson(str2,score);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s%s%d",str1,str2,&score);
int a=name[S(str1)];
int b=name[S(str2)];
cap[i][0]=a;
cap[i][1]=b;
cap[i][2]=score;
}
bool bcon=false;
for(i=0;i<4;i++)
{
if(last[i]<needperson[i])
{
puts("impossible");
bcon=true;
break;
}
}
if(bcon)
{
continue;
}
bfs(0,0);
printf("%d\n",ans);
}
return 0;
}