# HDU 1074 Doing Homework (状压DP + 路径记录)

cost 为 完成S中的所有任务所用的总时间 - 完成v的最后期限。

#include<cstdio>
#include<iostream>
#include<stack>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 16;

struct Nod{
char name[105];
int d,c;
}node[maxn];
int dp[1<<maxn],pre[1<<maxn];
int n;

void solve(){
int Ed = 1 << n;
fill(dp,dp+Ed,inf);
fill(pre,pre+Ed,-1);
int day,cost,S0,tmp,cnt;
dp[0] = 0;
for(int S = 1;S < Ed; S++){
for(int v = n - 1; v >= 0 ; v--){
if(!(S >> v & 1)) continue;
S0 = S - (1 << v);
day = 0;cost = 0;
for(int i = 0; i < n ; i++){
if(S0 >> i & 1) day += node[i].c;
}
if(node[v].d < day + node[v].c) cost = day + node[v].c - node[v].d;
if(dp[S] > dp[S0] + cost){
dp[S] = dp[S0] + cost;
pre[S] = S0;
//cout<<S<<" "<<S0<<" "<<v<<" "<<dp[S]<<endl;
}
}
}
printf("%d\n",dp[Ed-1]);
tmp = Ed - 1;
stack<int> stk;
while(pre[tmp] != -1){
cnt = 0;
while(!((tmp ^ pre[tmp]) >> cnt & 1)) cnt++;
stk.push(cnt);
tmp = pre[tmp];
}
while(!stk.empty()){
int top = stk.top();stk.pop();
printf("%s\n",node[top].name);
}
}

int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
for(int i = 0 ;i < n; i++){
scanf("%s%d%d",node[i].name,&node[i].d,&node[i].c);
}
solve();
}
return 0;
}


• 本文已收录于以下专栏：

## hdu1074Doing Homework【状态压缩】

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h...
• zhou_yujia
• 2016年01月07日 09:45
• 567

## HDU1074：Doing Homework(状态压缩DP)

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of ...
• libin56842
• 2014年04月22日 17:01
• 6268

## HDU1074 Doing Homework

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot o...
• starcuan
• 2014年02月06日 17:42
• 957

## HDU - 1074 Doing Homework

• u011345136
• 2014年07月02日 15:54
• 763

## hdu-1074-Doing Homework

• u010489389
• 2014年02月15日 01:10
• 492

## HDU_1789_DoingHomeworkAgain

Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
• baidu_29410909
• 2015年07月29日 23:25
• 337

## HDU 1074 Doing Homework (状压dp)

• csdn364988181
• 2016年01月17日 15:34
• 147

## HDU 1074 Doing Homework 状压Dp

• I_am_a_winer
• 2015年05月02日 00:18
• 330

## hdu 1074 Doing Homework (状压dp)

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
• u010228612
• 2013年09月10日 23:28
• 1012

## HDU 1074 Doing Homework(状压DP)

• u013013910
• 2014年10月16日 15:45
• 830

举报原因： 您举报文章：HDU 1074 Doing Homework (状压DP + 路径记录) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)