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