hdu 1074 dfs or bfs

来源:互联网 发布:网络的利与弊例子英语 编辑:程序博客网 时间:2024/05/19 04:50

//bfs

//Accepted 1074 31MS 2700K 1613 B C++
#include<iostream>
#include<queue>
#include<string>
#include<cstdio>
using namespace std;
int n;
struct node{
 int time,cost;
 int path[17];
};
node dp[1<<15];
struct obj{
 int cost;
 int deadline;
 char name[105];
}job[17];
void bfs()
{
 int i,j,tpath[17],tt,u;
 int p,N;
// memset(hash,false,sizeof(hash));
 memset(dp,-1,sizeof(dp));
 queue<int>q; 
 dp[0].cost = 0;
 dp[0].time = 0;
 q.push(0);
 while(!q.empty())
 {
  N =q.front();
  q.pop();
  for(i = 0; i< n; i++)
  {
   if( (N & (1<<i) ) == 0)  //第i件工作未完成
   {
    p = ( N|(1<<i) );
    for(j = 0; dp[N].path[j] != -1&&j < n; j++)//-1表示路径结束
    {
     tpath[j] = dp[N].path[j];
    }
    tpath[j++] = i;//加入i点
    tpath[j] = -1;
    u = job[i].cost + dp[N].time;
    tt = u > job[i].deadline ? u - job[i].deadline : 0;
    tt += dp[N].cost;
    if(dp[p].cost == -1)
    {
     for(j = 0;tpath[j] != -1&&j < n; j++)
     {
      dp[p].path[j] = tpath[j];
     }
     dp[p].path[j] = -1;
     dp[p].cost = tt;
     dp[p].time = u;
     q.push(p);
    }
    else if(tt < dp[p].cost)
    {
     for(j = 0;tpath[j] != -1&&j < n; j++)
     {
      dp[p].path[j] = tpath[j];
     }
     dp[p].path[j] = -1;
     dp[p].cost = tt;
     dp[p].time = u;
    }
   }
  }
 }
}
int main()
{
 int T,i;
 scanf("%d",&T);
 while(T--)
 {
  scanf("%d",&n);
  for(i = 0; i< n; i++)
  {
   scanf("%s %d %d",&job[i].name,&job[i].deadline,&job[i].cost);
  }
  bfs();
  printf("%d/n",dp[(1<<n) -1].cost);
  for(i = 0; i< n; i++)
  printf("%s/n",job[dp[(1<<n) - 1].path[i]].name);
 }
}
///////////////////////dfs

//Accepted 1074 281MS 312K 1205 B C++
//用二进制来表示已完成的状态  例如 001 100 101 分别表示
//做了第1件  第3件 1,3件 DP[(1<<n) - 1]表示做完了n件事的最优值 n=3时
//为dp["111"]即 dp[7]
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int dp[1<<15],n;
bool hash[17];
int path[17],tpath[17];
struct node{
 int cost;
 int deadline;
 char name[105];
}job[17];
void dfs(int nowtime,int nowcost,int num,int nowjob)
{
 int u,t;
  if(num >= n)
  {
    if(nowcost < dp[(1<<n) -1])
    {
      for(int i=0;i<n;i++)
      path[i] =tpath[i];
      dp[(1<<n)-1] = nowcost;
    }
    return ;
  }
  if(dp[nowjob] <= nowcost)
   return ;
  dp[nowjob] = nowcost;
  for(int i=0;i<n;i++)
  {
    if(hash[i])continue;
   hash[i] =true;      
        u = nowtime+job[i].cost;
    t = u > job[i].deadline ? u-job[i].deadline: 0;
    t += nowcost;
   tpath[num] = i;
   dfs(u,t,num+1,nowjob+(1<<i));
   hash[i]=false;
  }
}
int main()
{
 int T;
 scanf("%d",&T);
 while(T--)
 {
  int i;
  scanf("%d",&n);
  for(i = 0; i< n; i++)
  {
   scanf("%s %d %d",&job[i].name,&job[i].deadline,&job[i].cost);
  }
  memset(dp,0x7f,sizeof(dp));
  memset(hash,false,sizeof(hash));
  dfs(0,0,0,0);
  printf("%d/n",dp[(1<<n) - 1]);
  for(i = 0; i< n; i++)
  {
   printf("%s/n",job[path[i]].name);
  }
 }
}