hdu 1074 Doing Homework 记忆化dfs
1A 没说的~~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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;
}