标签:des style blog http color java os io
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5152 Accepted Submission(s):
2131
#include<iostream> #include<cstring> #include<cstdio> #define inf 1<<27 using namespace std; int n,mark[32868],c[40]; struct node { char str[200]; int x,y; }a[40]; struct no { int cost;//做的天数 int pre;//上一行的状态。 int reduce;//处罚 }dp[32868]; void output(int s)//递归输出。 { int i=s^dp[s].pre; int j=0; while(i) { i>>=1; j++; }//判断是哪个城市 if(dp[s].pre!=0) { output(dp[s].pre); } printf("%s\n",a[j].str); } int main() { int t,s,j,k,q,i; scanf("%d",&t); while(t--) { memset(mark,0,sizeof(mark)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s%d%d",a[i].str,&a[i].x,&a[i].y); } dp[0].pre=-1; dp[0].cost=0; dp[0].reduce=0; mark[0]=1; for(s=0;s<1<<n;s++)//上一行状态。 { for(i=1;i<=n;i++)//到这个城市。 { if((s&1<<i-1)!=0) continue; int r=s|(1<<i-1);//到这个城市之后的状态。 int day=dp[s].cost+a[i].y;//发费的总天数。 dp[r].cost=day; int reduce=day-a[i].x;//处罚数 if(reduce<0)reduce=0; reduce+=dp[s].reduce; if(mark[r])//标记这个状态有没有。 { if(dp[r].reduce>reduce) { dp[r].reduce=reduce; dp[r].pre=s; } } else//状态没有 { mark[r]=1; dp[r].reduce=reduce; dp[r].pre=s; } } } printf("%d\n",dp[(1<<n)-1].reduce); output((1<<n)-1); } return 0; }
HDU-1074 Doing Homework,布布扣,bubuko.com
标签:des style blog http color java os io
原文地址:http://www.cnblogs.com/cancangood/p/3897518.html