这题比较有意思,暴力搜索必然tle,可以用状态压缩dp解决。

我们先不考虑完成所有作业的扣分,而考虑其一个子集的情况。

假设我们得到了完成某子集S对应的作业最少扣分,我们试着向该子集中增加一个元素a,那么我们将得到一个新的集合S1。

从而f(S1) = min(g(S')),  S'⊂S, 且#(S') = #(S) - 1。

其中g函数仅依赖于集合S'与元素e = (S - S')。

如果我们能够在处理S之前将其所有真子集都处理完毕,那么S可以直接由原状态导出。

于是当更新到S为全集的时候,答案也就得到了。

考虑用二进制表示状态,二进制数某一位为1或0代表同位次的元素属于(不属于)该集合。

所有子集的数值大小都比原集合小。

将二进制数从小到大扫描一遍即可。

这就是所谓的状态压缩dp。

复杂度O(n * 2^n)。

acm.hdu.edu.cn/showproblem.php?pid=1074
 
 
 #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
typedef __int64 LL; const int inf = 0x3f3f3f3f;
const int maxn = + ;
const int maxm = << ; char s[][maxn];
int n, high;
struct Node{
int t, dl;
}node[maxn];
int dp[maxm];
int tc[maxm], pre[maxm], ans[]; void print(){
printf("%d\n", dp[high]);
int p = high, k = ;
while(p){
ans[k++] = pre[p];
p -= << pre[p];
}
for(int i = k - ; i >= ; i--) puts(s[ans[i]]);
} int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%s%d%d", s[i], &node[i].dl, &node[i].t);
}
high = ( << n) - ;
memset(dp, inf, sizeof dp);
dp[] = ;
for(int i = ; i <= high; i++){
for(int j = n - ; j >= ; j--){
int tem = << j;
//update the current state by enumerating the new element
if(tem & i){
//i is the current state while (i - tem) is the previous state
int p = max(, node[j].t + tc[i - tem] - node[j].dl);
if(p + dp[i - tem] < dp[i]){
dp[i] = p + dp[i - tem];
tc[i] = node[j].t + tc[i - tem];
pre[i] = j;
}
}
}
}
print();
}
return ;
}

hdu1074 Doing Homework的更多相关文章

  1. 状态压缩-----HDU1074 Doing Homework

    HDU1074 Doing Homework 题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当 ...

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

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

  3. kuangbin专题十二 HDU1074 Doing Homework (状压dp)

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

  4. HDU1074 Doing Homework —— 状压DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (J ...

  5. HDU1074 Doing Homework 状态压缩dp

    题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 /* 首先要明白的一点是状态1/0分别表示这件事做了还是没做 而1/0的位 ...

  6. HDU1074 Doing Homework(状压dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:给定有n门课的作业,每门课交作业有截止时间,和完成作业所花费的时间,如果超过规定时间完成,每超 ...

  7. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  8. HDU1074:Doing Homework(状压DP)

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

  9. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

随机推荐

  1. 异常积累:org.hibernate.StaleStateException

    ERROR - Exception executing batch:  org.hibernate.StaleStateException: Batch update returned unexpec ...

  2. 单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)

    对于单链表来说,判断回文最简单的方法就是遍历链表,将链表中的元素复制到数组中,然后对数组进行判断是否是回文数组,但是这不符合O(1)的空间复杂度. 由于空间复杂度的要求,需要就地操作链表,不能开辟多余 ...

  3. log4j使用

    Spring中在src/main/resources下创建log4j.xml 或log4j.properties,在maven下打包时resources文件夹下面的文件会自动copy到WEB-INF/ ...

  4. 算法训练 区间k大数查询

    http://lx.lanqiao.org/problem.page?gpid=T11 算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB        问题描述 给定一个 ...

  5. 大数据量的csv文件如何导入到 sql 数据库

    BULK INSERT dbo.T_test001 FROM 'E:\bus_20160316\bus全量评级及借款编号_20160316.csv' WITH ( FIELDTERMINATOR =' ...

  6. 衣明志是个SB

    面试碰到衣明志,问了些傻逼问题,尼玛就是一不折不扣的蠢驴. 这个人太能装了,而且水平也不咋地.

  7. 【海岛帝国系列赛】No.2 海岛帝国:“落汤鸡”市的黑帮危机

    50200210海岛帝国:“落汤鸡”市的黑帮危机 [试题描述] 近几天,犯罪分子发现“药师傅”帝国的警力约等于0.(请见YSF的海岛帝国)于是开始猖狂了起来.他们选择了依山靠水(农村?)的“落汤鸡”市 ...

  8. TortoiseSVN,排除不想提交文件的方法(转)

    转自:tortoisesvnsubversionfilebuilddialoglist 下面是英文帮助: 利用TortoiseSVN的修改列表 功能可以实现,在新版本中TortoiseSVN特地预置了 ...

  9. shell 加减乘除

    #!/bin/basha=$1b=$2echo a+b=$(($a+$b))echo a-b=$(($a-$b))echo a*b=$(($a*$b))echo a/b=$(($a/$b))echo ...

  10. JNI 概述【转】

    本文转载自:http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/overview.html 相信很多做过 Java 或 Androi ...