题目大意:

根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时

这里n最大为15,可以利用状态压缩来解决问题

 /*
首先要明白的一点是状态1/0分别表示这件事做了还是没做
而1/0的位置表示这是哪一件事
比如说 5 可以表示为101,那么表示第一个和第三个任务已经完成
而dp[5]表示第一个和第三个任务完成所花费的最短时间
而状态5(101)是从状态1(001)或者状态4(100)转移过来的
也就是说我们总是可以通过一个较小的状态不断递推一个较大状态的dp值 dp[j] = min(dp[i] , dp[j]) j=i|(1<<k) (0<=k<n)
也就是说我从 i 这个状态上又完成了第 k 件任务后达到了状态 j 另外我们要记录任务的顺序,我利用的是rec[]数组,rec[i]表示
在第i个状态时最后完成的任务的序号,假设n=5,然后我就可以从
11111这个状态开始不断往前记录一个个任务的序号 */
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int MAXN = <<;
//_time[i]记录状态i时完成任务的总时间
int id[MAXN+] , dp[MAXN+] , _time[MAXN+] , rec[MAXN+] , rev[];
char str[][];
int D[] , C[]; int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
int n;
scanf("%d" , &n);
for(int i=; i<n ; i++){
scanf("%s%d%d" , str[i] , D+i , C+i);
}
int all = <<n; //状态总数
memset(dp , 0x3f , sizeof(dp));
//0状态表示什么都没做,自然扣除的分数为0
dp[] = ;
memset(_time , , sizeof(_time));
//从小状态不断往前可以不断更新更大状态的值
for(int i= ; i<all ; i++){
//有n个任务,一个个检测哪个任务可以接在状态i的后面去做
for(int j= ; j<n ; j++){
int s = <<j;
if(!(i&s)){
int state = i|s , add;
_time[state] = _time[i] + C[j];
add = _time[state]-D[j]>?_time[state]-D[j]:;//判断这个新任务加进来是否要被罚时
//dp[state] = min(dp[state] , dp[i]+add);
//更新rec[],后面一个条件是因为要按字典序排列,所以碰到值相等的情况,往往取较小的那个
if(dp[state] > dp[i]+add || (dp[state] == dp[i]+add && strcmp(str[j] , str[rec[state]])>=)){
dp[state] = dp[i]+add;
rec[state] = j;
}
}
}
} printf("%d\n" , dp[all-]); int st = all - ;
//逆序的,所以要用rev[]重新记录反过来的顺序
for(int i= ; i<n ; i++){
int index = rec[st] ;
rev[n-i-] = index;
st -= (<<index);
}
//依次输出
for(int i= ; i<n ; i++)
printf("%s\n" , str[rev[i]]);
}
return ;
}

HDU1074 Doing Homework 状态压缩dp的更多相关文章

  1. hdu1074 Doing Homework(状态压缩DP Y=Y)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  2. HDU 1074 Doing Homework (状态压缩 DP)

    题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...

  3. D - Doing Homework 状态压缩 DP

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  4. Doing Homework 状态压缩DP

    Doing Homework 题目抽象:给出n个task的name,deadline,need.  每个任务的罚时penalty=finish-deadline;   task不可以同时做.问按怎样的 ...

  5. HDU 1074 Doing Homework(状态压缩DP)

    题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. #include<iostream& ...

  6. HDU1074(KB12-D 状态压缩dp)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  7. HDU1074(状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  9. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

随机推荐

  1. 题解报告:hdu1202The calculation of GPA(算绩点问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1202 Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对 ...

  2. 题解报告:hdu 1060 Leftmost Digit

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060 问题描述 给定一个正整数N,你应该输出N ^ N的最左边的数字. 输入 输入包含多个测试用例. ...

  3. 总结用CoreText绘制文本时遇到的问题以及解决办法

    关于CoreText不做解释.用的人自然知道这个是干什么的. 功能非常强大,可以绘制文本,图片等. 这次用的Xcode7.0的版本.所以之前很多方法,现在不能用.也不是不能用,就是有黄色警告很不爽. ...

  4. sql server添加用户和给用户授权

    --创建用户CREATE LOGIN 用户名 WITH PASSWORD=N'密码', DEFAULT_DATABASE=数据库名, CHECK_EXPIRATION=OFF, CHECK_POLIC ...

  5. ajax通过新闻id获取列表

    <div class="index_main">        <div class="page_l">           <i ...

  6. Android习惯--Activity启动方法

    public void Text extends Activity{ public void static actionStart(Context context, int i, String str ...

  7. spring.net应用

    经过一段时间的调试,终于把spring.net中关于aop的方面给做个了一个比较完整的Demo.包含异常日志和性能日志.spring.net和log4net配置. http://files.cnblo ...

  8. iOS-UI控件之UITableView(一)

    UITableView 介绍 UITableView 是用来用列表的形式显示数据的UI控件 举例 QQ好友列表 通讯录 iPhone设置列表 tableView 常见属性 // 设置每一行cell的高 ...

  9. iOS-UI控件之UIImageView

    contentMode属性 带有scale单词的:图片有可能会拉伸 UIViewContentModeScaleToFill 将图片拉伸至填充整个imageView 图片显示的尺寸跟imageView ...

  10. JFreeChart应用(生成折线图)

    1.jar包,jcommon.jar和jfreechart.jar,具体用哪个版本官网去down吧: 还有另外一个jar包,gnujaxp.jar,这个引入之后编译的时候会报错,应该是xsd校验的问题 ...