| 
	
	
		
			http://acm.hdu.edu.cn/showproblem.php?pid=1074
 //1311853 2009-04-26 19:16:12 Accepted 1074 281MS 524K 1323 B C++ no way 
  #include<iostream> 
  #include<string> 
  using namespace std; 
  struct Node 
    { 
  string course; 
  int deadline; 
  int need; 
  }infor[16]; 
  int n; 
   int binary[16] =  {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}; 
  int flag[65536]; 
  bool mark[16]; 
  string str[16],outs[16]; 
  void dfs(int days,int cost,int sum,int num)//num表示选择的作业数 
    { //days表示写作业的开始日期,cost表示前面的花费,sum记录作业是否完成情况 
  int i,temp; 
  if(num == n) 
     { 
  if(flag[sum] == cost) 
     { 
  flag[sum] = cost; 
  for(i=0;i<num;i++) 
  outs[i] = str[i]; 
  } 
  return ; 
  } 
  for(i=1;i<=n;i++) 
     { 
  if(mark[i] == false) 
     { 
  mark[i] = true; 
  sum += binary[i];//要写第i门作业 
   /**//////////////////////////////////////////////////// 
  temp = days + infor[i].need - infor[i].deadline; 
  if(temp < 0) 
  temp = cost; 
  else 
  temp += cost; 
  //  第i门作业完成后的代价 temp 
   /**/////////////////////////////////////// 
  if(flag[sum] > temp) 
     { 
  flag[sum] = temp; //记录状态 
  
  str[num++] = infor[i].course; 
  
  dfs(days + infor[i].need,temp,sum,num); 
  
  num --; 
  } 
  sum -= binary[i]; 
  mark[i] = false; 
  } 
  } 
  } 
  int main() 
    { 
  int t; 
  cin>>t; 
  while(t--) 
     { 
  int i,st=0; 
  cin>>n; 
  for(i=1;i<=n;i++) 
  cin>>infor[i].course>>infor[i].deadline>>infor[i].need; 
  for(i=0;i<65536;i++) 
  flag[i] = 1000000; 
  memset(mark,false,sizeof(mark));//标记状态 
  dfs(0,0,0,0); 
  for(i=1;i<=n;i++) 
  st += binary[i];  //结果存放在下标为st的flag[st]值中 
  cout<<flag[st]<<endl; 
  for(i=0;i<n;i++) 
  cout<<outs[i]<<endl; 
  } 
  return 0; 
  }     |