hdu 1074

#include<stdio.h>
#define inf  0x7fffffff
int max(int a,int b) {
    return a>b?a:b;
}
typedef struct {
    int dead,time;
    char s[200];
}H;
typedef struct {
    int val,last,time;
}F;
F dp[1<<16];
H a[20];
int ans[20];
int main() {
    int i,j,T,n,m;
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%s%d%d",a[i].s,&a[i].dead ,&a[i].time );
        for(i=0;i<(1<<n);i++) {
            dp[i].last=-1;
            dp[i].val=inf;
        }
  dp[0].last=-1;
  dp[0].val=0;
  dp[0].time=0;
  for(i=0;i<(1<<n);i++)
      for(j=0;j<n;j++) {
          if((i&(1<<j))!=0)
              continue;
          int p=(i|(1<<j));
          dp[p].time=dp[i].time+a[j].time;
          if(dp[p].val>dp[i].val+max(dp[p].time-a[j].dead,0)) {
              dp[p].val=dp[i].val+max(dp[p].time-a[j].dead,0);
              dp[p].last=j;
          }
      }
      printf("%d
",dp[(1<<n)-1].val);
     int t=(1<<n)-1;
      int k=n-1;
      while(dp[t].last!=-1) {
           ans[k--]=dp[t].last;
          t=(t&(~(1<<dp[t].last)));
      }
      for(i=0;i<n;i++)
          printf("%s
",a[ans[i]].s);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410996.html