HDU1074 Doing Homework 状态压缩dp
题目大意:
根据完成任务的截止时间,超时一天罚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的更多相关文章
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1074 Doing Homework (状态压缩 DP)
题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...
- 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 ...
- Doing Homework 状态压缩DP
Doing Homework 题目抽象:给出n个task的name,deadline,need. 每个任务的罚时penalty=finish-deadline; task不可以同时做.问按怎样的 ...
- HDU 1074 Doing Homework(状态压缩DP)
题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. #include<iostream& ...
- HDU1074(KB12-D 状态压缩dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1074(状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- QQ文件没有读取权限,60017导致QQ无法登陆的终极解决办法
每隔一段时间,我的QQ就无法登陆,提示:QQ文件没有读取权限,60017导致QQ无法登陆的终极解决办法 点击了解详情发现里面的解决办法根本不起作用,网上 说的各种解决办法都不起作用,解决办法如下 1. ...
- win10系统下使用EDGE浏览器找不到Report Builder 启动图标
Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标.
- C# winform与Javascript的相互调用[转]
原文链接<html> <head> <meta http-equiv="Content-Language" content="zh-cn&q ...
- 10-1 浮动框架iframe
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- TestNG基本注解(一)
TestNG基本注解 注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中. @AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后. @Bef ...
- 转】RMySQL数据库编程指南
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Sep 24, 2013 Ta ...
- Java的知识储备及面试-几个方面
1.Java本身语法基础 https://github.com/Snailclimb/JavaGuide/blob/master/Java%E7%9B%B8%E5%85%B3/Java%E5%9F%B ...
- [小记]Android缓存问题
今天晚上,产品经理打电话说我们的Android App除了问题,问题很简单就是一个缓存问题,由于这个程序是前同事写的,我也只能呵呵一笑,有些事你就得扛.还是回到正题吧,这个缓存问题,实在有点奇葩,所以 ...
- 【C++】朝花夕拾——表达式树
表达式树: 叶子是操作数,其余结点为操作符,是二叉树的其中一种应用 ====================我是分割线====================== 一棵表达式树如下图: 若是对它做中序 ...
- boostrapvalidator
一个例子 <%@ page contentType="text/html;charset=UTF-8" language="java" %> < ...