1 #include<stdio.h>
2 #include<string.h>
3 char s[20][105];
4 int ded[20],day[20],hash[40000];
5 struct s
6 {
7 int time,pre,lost;
8 }dp[40000];
9 void Print(int state)
10 {
11 if (state==0) return;
12 Print(state^(1<<dp[state].pre));
13 printf("%s\n",s[dp[state].pre]);
14 }
15 int main()
16 {
17 int T,n,i,j,cur,state,temptime,templost;
18 scanf("%d",&T);
19 while (T--)
20 {
21 scanf("%d",&n);
22 getchar();
23 for (i=0;i<n;i++) scanf("%s %d %d",s[i],&ded[i],&day[i]);
24 state=(1<<n);
25 memset(hash,0,sizeof(hash));
26 dp[0].time=0; dp[0].pre=-1; dp[0].lost=0;
27 for (i=0;i<state;i++)
28 for (j=0;j<n;j++)
29 if ((i&(1<<j))==0)
30 {
31 cur=(i|(1<<j));
32 temptime=dp[i].time+day[j];
33 if (temptime<=ded[j]) templost=dp[i].lost;
34 else templost=dp[i].lost+temptime-ded[j];
35 if (hash[cur]==0)
36 {
37 dp[cur].time=temptime;
38 dp[cur].pre=j;
39 dp[cur].lost=templost;
40 hash[cur]=1;
41 }
42 else if (dp[cur].lost>templost)
43 {
44 dp[cur].time=temptime;
45 dp[cur].pre=j;
46 dp[cur].lost=templost;
47 }
48 }
49 printf("%d\n",dp[state-1].lost);
50 Print(state-1);
51 }
52 }
http://acm.hdu.edu.cn/showproblem.php?pid=1074