标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1074
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7704 Accepted Submission(s): 3484
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <string> 5 #include <map> 6 #include <stack> 7 #include <iostream> 8 using namespace std; 9 #define N 15 10 #define INF 100000000 11 struct node 12 { 13 int dead,cost; 14 char s[105]; 15 }course[N+1]; 16 struct P 17 { 18 int pre,score,now,time; 19 //pre记录完成某一个学科的作业之前已经完成的学科的作业的集合 20 //now记录当前更新的学科,pre和now用作路径输出 21 //score是减少的学分的总数,time是当前时间 22 }dp[1<<N]; 23 int vis[1<<N]; 24 25 int main() 26 { 27 int t; 28 cin>>t; 29 while(t--){ 30 int n; 31 cin>>n; 32 memset(dp,0,sizeof(dp)); 33 memset(vis,0,sizeof(vis)); 34 for(int i=0;i<n;i++){ 35 cin>>course[i].s>>course[i].dead>>course[i].cost; 36 } 37 int en=(1<<n)-1; 38 for(int i=0;i<en;i++){ 39 for(int j=0;j<n;j++){ 40 int temp=1<<j; 41 if((i&temp)==0){//如果当前的学科作业还没完成 42 int cur=i|temp;//当完成该科作业时的情况 43 dp[cur].time=dp[i].time+course[j].cost;//当前使用的时间 44 int b=dp[i].time+course[j].cost-course[j].dead; 45 if(b<0) b=0; 46 if(vis[cur]){//如果已经完成过该作业就更新 47 if(dp[cur].score>dp[i].score+b){ 48 dp[cur].score=dp[i].score+b; 49 dp[cur].pre=i;//还没完成该学科之前已经完成了的学科 50 dp[cur].now=j;//当前的学科 51 } 52 } 53 else{//如果没完成直接更新 54 vis[cur]=1; 55 dp[cur].score=dp[i].score+b; 56 dp[cur].pre=i; 57 dp[cur].now=j; 58 } 59 } 60 } 61 } 62 cout<<dp[en].score<<endl; 63 stack <int> S; 64 //用栈输出完成作业的路径,也可以用递归 65 while(en>0){ 66 S.push(dp[en].now); 67 en=dp[en].pre; 68 } 69 while(!S.empty()){ 70 cout<<course[S.top()].s<<endl; 71 S.pop(); 72 } 73 } 74 return 0; 75 }
2016-06-26
标签:
原文地址:http://www.cnblogs.com/fightfordream/p/5618332.html