http://acm.hdu.edu.cn/showproblem.php?pid=3720

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<map> 8 #include<string> 9 using namespace std; 10 #define INF 0x3f3f3f 11 map<string,int>f; 12 struct node 13 { 14 char s[101],po[35]; 15 int v,k; 16 }p[30]; 17 int pa[30],flag,w[30][30],maxz; 18 void dfs(int x,int a,int b,int c,int d,int sum) 19 { 20 int i,j; 21 if(x==24&&a==4&&b==4&&c==2&&d==1) 22 { 23 for(i =1; i <= 11 ; i++) 24 for(j = i+1 ; j <= 11 ; j++) 25 sum+=w[pa[i]][pa[j]]; 26 maxz = max(maxz,sum); 27 flag = 1; 28 return ; 29 } 30 if(x>23) return ; 31 pa[a+b+c+d+1] = x; 32 if(p[x].k == 4) 33 { 34 if(d<1) 35 dfs(x+1,a,b,c,d+1,sum+p[x].v); 36 } 37 else if(p[x].k==2) 38 { 39 if(b<4) 40 dfs(x+1,a,b+1,c,d,sum+p[x].v); 41 } 42 else if(p[x].k==3) 43 { 44 if(c<2) 45 dfs(x+1,a,b,c+1,d,sum+p[x].v); 46 } 47 else if(a<4) 48 { 49 dfs(x+1,a+1,b,c,d,sum+p[x].v); 50 } 51 dfs(x+1,a,b,c,d,sum); 52 } 53 int main() 54 { 55 int i,n,v; 56 char s1[35],s2[35]; 57 while(cin>>p[1].s>>p[1].v>>p[1].po) 58 { 59 f.clear(); 60 f[p[1].s] = 1; 61 maxz=-INF;flag=0; 62 memset(w,0,sizeof(w)); 63 for(i = 2; i <=23 ;i++) 64 { 65 cin>>p[i].s>>p[i].v>>p[i].po; 66 } 67 for(i = 1; i <= 23 ; i++) 68 { 69 if(strcmp(p[i].po,"defender")==0) 70 p[i].k = 1; 71 else if(strcmp(p[i].po,"midfielder")==0) 72 p[i].k = 2; 73 else if(strcmp(p[i].po,"striker")==0) 74 p[i].k = 3; 75 else p[i].k = 4; 76 f[p[i].s] = i; 77 } 78 cin>>n; 79 for(i = 1; i <= n ; i++) 80 { 81 getchar(); 82 cin>>s1>>s2>>v; 83 w[f[s1]][f[s2]] = v; 84 w[f[s2]][f[s1]] = v; 85 } 86 dfs(1,0,0,0,0,0); 87 if(!flag) puts("impossible"); 88 else printf("%d ",maxz); 89 } 90 return 0; 91 }