hdu 1074 Doing Homework 记忆化dfs

1A   没说的~~

View Code
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

struct node{
int t,deadline;
char s[105];
}ar[16];

int n,m,Min,vis[16],path[16],ans[16],dp[70000];
int d[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};

int cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}

void dfs(int i,int day,int fen,int num)
{
int j,point;
if (i==n)
{
if(dp[m]<Min)
{
Min=dp[m];
memcpy(ans,path,sizeof(ans));
}
return;
}
for (j=0;j<n;j++)
{
if(!vis[j])
{
vis[j]=1;
point=day+ar[j].t-ar[j].deadline;
if(point<0)point=0;
num+=d[j];
fen+=point;
if(fen<dp[num])
{
dp[num]=fen;
path[i]=j;
dfs(i+1,day+ar[j].t,fen,num);
}
fen-=point;
num-=d[j];
vis[j]=0;
}
}
}

int main()
{
int T,i;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%s%d%d",ar[i].s,&ar[i].deadline,&ar[i].t);

for (i=0,m=0;i<n;i++)m+=d[i];
sort(ar,ar+n,cmp);
memset(vis,0,sizeof(vis));
memset(dp,0x3f3f3f3f,sizeof(dp));
Min=0x3f3f3f3f;

dfs(0,0,0,0);

printf("%d\n",Min);
for (i=0;i<n;i++)
printf("%s\n",ar[ans[i]].s);
}
return 0;
}





posted @ 2011-10-28 14:12  104_gogo  阅读(148)  评论(0编辑  收藏  举报