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