标签:
1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stdio.h> 5 using namespace std; 6 const int INF = 0x3f3f3f3f; 7 struct sion 8 { 9 int sco, cos; 10 }dp[1<<15 + 1]; 11 12 int dead[20], cost[20], prel[1<<15 + 1], pren[1<<15 + 1]; 13 char name[20][20]; 14 15 int main() 16 { 17 int T; 18 int n; 19 int t; 20 while(cin >> T) 21 { 22 while(T--) 23 { 24 scanf("%d", &n); 25 for(int i = 0; i < n; i++) 26 { 27 scanf("%s", name[i]); 28 cin >> dead[i] >> cost[i]; 29 } 30 memset(dp, 0, sizeof(dp)); 31 memset(prel, 0, sizeof(prel)); 32 memset(pren, 0, sizeof(pren)); 33 //////状态压缩 34 int cnt = 0; 35 for(int i = 1; i < (1<<n); i++) 36 { 37 dp[i].sco = INF; //初始化 38 for(int j = n - 1; j >= 0; j--) //从最后一门课开始判断状态,同时保证无后序性 39 { 40 int x = 1 << j; 41 if(x & i) //判断 是否选了第j课 42 { 43 if(dp[i - x].cos + cost[j] - dead[j] < 0) //如果j前面选的课花费的时间小于dead line那么没有减分 44 t = 0; 45 else t = dp[i - x].cos + cost[j] - dead[j]; 46 47 if(t + dp[i-x].sco < dp[i].sco) //转移 48 { 49 dp[i].sco = t + dp[i-x].sco; 50 dp[i].cos = cost[j] + dp[i-x].cos; //由于是压缩过的特殊数组,表达某门课是否被选不能直接使用i的值 51 pren[i] = j; //故,记录选取的位置 52 prel[i] = i - x; //记录选取时的值 53 } 54 } 55 } 56 } 57 printf("%d\n", dp[(1<<n) -1].sco); 58 int t = (1<<n) - 1; //最后转移的课,同时最先的一门课 59 while(t) //逆序取出 60 { 61 dead[cnt++]=pren[t]; 62 t = prel[t]; 63 } 64 for(int i = cnt-1; i >= 0; i--) 65 { 66 printf("%s\n", name[dead[i]]); 67 } 68 } 69 } 70 } 71 /** 72 * 73 *还是太鶸 orz orz orz 74 */
标签:
原文地址:http://www.cnblogs.com/Yumesenya/p/5451308.html