hdu 1074 doing homework

来源:互联网 发布:淘宝记录怎么删除 编辑:程序博客网 时间:2024/05/13 17:51
思路:纪录每个状态的最小花费dp[i] 然后转移 转移的时候要用到位运算 用1<<j表示第j个课程的选择 i&(<span style="font-family: Arial, Helvetica, sans-serif;">1<<j)检测是否由dp[i-(</span><span style="font-family: Arial, Helvetica, sans-serif;">1<<j</span><span style="font-family: Arial, Helvetica, sans-serif;">)]转移而来 然后全部取最小的 ,但是这个地方的转移顺序很需要注意! 选择j的时候要n-1 to 0 因为要用字典序最小的状态转移而来 所以字典序排序应该是j越大 之前的状态字典序越小 </span>
#include <iostream>  #include <string>  #include <cstring>  #include <stack>  #include <algorithm>  using namespace std;    const int inf = 1<<30;    struct node  {      string name;      int dead,cost;  } a[50];    struct kode  {      int time,score,pre,now;  } dp[1<<15];    int main()  {      int t,i,j,s,n,end;      cin >> t;      while(t--)      {          memset(dp,0,sizeof(dp));          cin >> n;          for(i = 0; i<n; i++)              cin >> a[i].name >> a[i].dead >> a[i].cost;          end = 1<<n;          for(s =  1; s<end; s++)          {              dp[s].score = inf;              for(i = n-1; i>=0; i--) // 此处转移应该注意顺序 n-1 to 0<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
            {                  int tem = 1<<i;                  if(s & tem)                  {                      int past = s-tem;                      int st = dp[past].time+a[i].cost-a[i].dead;                      if(st<0)                          st = 0;                      if(st+dp[past].score<dp[s].score)                      {                          dp[s].score = st+dp[past].score;                          dp[s].now = i;                          dp[s].pre = past;                          dp[s].time = dp[past].time+a[i].cost;                      }                  }              }          }          stack<int> S;          int tem = end-1;          cout << dp[tem].score << endl;          while(tem)          {              S.push(dp[tem].now);              tem = dp[tem].pre;          }          while(!S.empty())          {              cout << a[S.top()].name << endl;              S.pop();          }      }        return 0;  }  

0 0
原创粉丝点击