//状压DP
//Doing Homework
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
struct hw
{
string name;
int d;
int c;
};
hw homework[16];
int pre[(1<<15)+10];//到达这个状态的前驱状态是什么
int t[(1<<15)+10];//开始做第i个作业时已花费的时间
int dp[(1<<15)+10];
int n;
void output(int x)
{
if(!x)return;
output(x-(1<<pre[x]));
cout<<homework[pre[x]].name<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int cas;
cin>>cas;
while(cas--)
{
memset(t,0,sizeof(t));
memset(pre,0,sizeof(pre));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>homework[i].name>>homework[i].d>>homework[i].c;
}
int num=1<<n;
for(int i=0;i<num;i++)
{
dp[i] = INF;
}
dp[0]=0;
for(int i=0;i<num;i++)
{
for(int j=n-1;j>=0;j--)//倒序是因为如111&100,则要知道dp[111](111,100为二进制)
{
int temp = 1<<j;//做第几个作业
if(i&temp)
{
int score = t[i-temp]+homework[j].c-homework[j].d;
if(score<0)
{
score=0;
}
if(dp[i]>score+dp[i-temp])//罚最小
{
dp[i] = dp[i-temp]+score;
t[i] = t[i-temp]+homework[j].c;
pre[i]=j;
}
//cout<<dp[i]<<" "<<t[i]<<" "<<pre[i]<<endl;
}
}
}
cout<<dp[num-1]<<endl;
output(num-1);
}
return 0;
}
HDU - 1074 Doing Homework
最新推荐文章于 2019-04-30 12:30:26 发布