码迷,mamicode.com
首页 > 其他好文 > 详细

Doing Homework 状态压缩DP

时间:2015-04-09 23:36:12      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

                        Doing Homework

题目抽象:给出n个task的name,deadline,need。  每个任务的罚时penalty=finish-deadline;   task不可以同时做。问按怎样的顺序做使得penalty最小。同时输出顺序。如果有多个满足条件的顺序,按字典序输出。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <list>
13 #include <iomanip>
14 #include <cstdlib>
15 #include <sstream>
16 using namespace std;
17 typedef long long LL;
18 const int INF=0x5fffffff;
19 const double EXP=1e-6;
20 const int MS=16;
21 
22 struct task
23 {
24       char name[105];
25       int deadline,need;
26 }tasks[MS];
27 
28 struct node
29 {
30       int time,penalty;   //  到达这个状态的时间,和罚时
31       int cur,pre;          //   状态s的物理变化过程
32 }nodes[1<<MS];
33 
34 int n,m;
35 
36 void solve()
37 {
38       for(int i=1;i<=m;i++)        //  note   i==1
39             nodes[i].penalty=INF;
40       nodes[0].time=0;
41       for(int i=0;i<=m;i++)
42       {
43             for(int j=0;j<n;j++)
44                   if(!((i>>j)&1))
45                   {
46                         int next=i|(1<<j);
47                         int finish=nodes[i].time+tasks[j].need;
48                         int penalty=max(0,finish-tasks[j].deadline);
49                         penalty+=nodes[i].penalty;
50                         if(penalty<nodes[next].penalty)
51                         {
52                               nodes[next].time=finish;
53                               nodes[next].penalty=penalty;
54                               nodes[next].cur=j;
55                               nodes[next].pre=i;
56                         }
57                   }
58       }
59 }
60 
61 void output(int x)
62 {
63       if(x==0)
64             return ;
65        output(nodes[x].pre);
66        printf("%s\n",tasks[nodes[x].cur].name);
67 }
68 
69 int main()
70 {
71       int T;
72       scanf("%d",&T);
73       while(T--)
74       {
75             scanf("%d",&n);
76             for(int i=0;i<n;i++)
77                   scanf("%s%d%d",tasks[i].name,&tasks[i].deadline,&tasks[i].need);
78             m=(1<<n)-1;
79             solve();
80             printf("%d\n",nodes[m].penalty);
81             output(m);
82       }
83       return 0;
84 }

 

Doing Homework 状态压缩DP

标签:

原文地址:http://www.cnblogs.com/767355675hutaishi/p/4412642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!