题目大意:

根据完成任务的截止时间,超时一天罚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. 473 Matchsticks to Square 火柴拼正方形

    还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到.输入为小女孩拥有火柴的 ...

  2. javaweb-JSP action中附件下载的写法

     附件下载(包括图片,exl,word)在前台必须给出一个iframe 或者类似于window的窗口,另外,Java文件下载不能通过ajax进行请求,必须添加src属性首选,前台的链接拼接html如下 ...

  3. 理解http浏览器的协商缓存和强制缓存

    阅读目录 一:浏览器缓存的作用是什么? 二:理解协商缓存 1 Last-Modified/if-Modify-Since 2 ETag/if-None-Match 三:理解强制缓存 回到顶部 一:浏览 ...

  4. Docker安装jenkins(六)

    这里是在linux环境下安装docker之后,在doucer内安装jenkins --------------------docker 安装 jenkins---------------------- ...

  5. sqlServer备份和还原语句

    数据库备份语句和还原语句: --完整备份 Backup Database xxx To disk=’G:\Backup\xxx.bak’ --查看物理路径 restore filelistonly f ...

  6. jquery 序列化form表单

    1.为什么要将form表单序列化? ajax上传form表单的原始方式,是将form表单中所需要的键值对先获取,然后再组装成数据(两种方式:http:localhost:8080/test.do?pe ...

  7. spark源码编译,运行example遇到:NoClassDefFoundError: org/spark_project/guava/cache/CacheLoader

    基本环境: win10+idea Scala2.11.8 maven3.5.3 spark2.1.0 问题: 在window10下编译spark2.1.0源码,在idea下运行example,遇到问题 ...

  8. vue2.0版本指令v-if与v-show的区别

    v-if: 判断是否加载,可以减轻服务器的压力,在需要时加载. v-show:调整css dispaly属性,可以使客户端操作更加流畅. v-if示例: <!DOCTYPE html> & ...

  9. swift 待研备份

    https://www.ctolib.com/topics-115290.html 但是还是用到了一个叫做 The Protocol Witness Table (PWT) 的函数表 https:// ...

  10. C#override与new修饰隐藏的区别(转载)

    C#比java多一个new隐藏的功能.C# override重写相当于java中没有关键字的方法重写.所以java中方法是没有隐藏功能的. C# override重写,是指对父类中的虚方法(标记vir ...