标签:des style blog http color os io for
2 3 Computer 3 3 English 20 1 Math 3 2 3 Computer 3 3 English 6 3 Math 6 3
2 Computer Math English 3 Computer English MathHintIn the second test case, both Computer->English->Math and Computer->Math->English leads to reduce 3 points, but the word "English" appears earlier than the word "Math", so we choose the first order. That is so-called alphabet order.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
const int maxn=1<<15;
char s[20][110];
int dp[maxn],t[maxn],pre[maxn];//dp[i]储存做作业的各种状态,t[i]表示经过的时间,pre[i]表示某种状态的的前驱
int dead[20],fin[20];
void print(int x)
{
if(!x)
return ;
print(x-(1<<pre[x]));
printf("%s\n",s[pre[x]]);
}
int main()
{
int tt,n;
scanf("%d",&tt);
while(tt--)
{
scanf("%d",&n);
memset(t,0,sizeof(t));
memset(pre,0,sizeof(pre));
for(int i=0;i<n;i++)
scanf("%s%d%d",&s[i],&dead[i],&fin[i]);
int end=1<<n;
for(int i=1;i<end;i++)
{
dp[i]=INT_MAX;
for(int j=n-1;j>=0;j--)//从后往前枚举
{
int temp=1<<j;
if(!(i&temp))
continue;
int cost=t[i-temp]+fin[j]-dead[j];//时间消耗
if(cost<0)
cost=0;
if(dp[i]>dp[i-temp]+cost)
{
dp[i]=dp[i-temp]+cost;
t[i]=t[i-temp]+fin[j];
pre[i]=j;
// cout<<i<<" "<<j<<endl;
}
}
}
printf("%d\n",dp[end-1]);//end-1是每种作业都完成的状态
print(end-1);
}
return 0;
}
HDU 1074 Doing Homework(状压DP),布布扣,bubuko.com
标签:des style blog http color os io for
原文地址:http://blog.csdn.net/u013582254/article/details/38636073