这题比较有意思,暴力搜索必然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. 伪类写border, transform: scale3d() 及兼容性

    .top::before { content: ""; position: absolute; left: 0; width: 200%; height: 0; border-to ...

  2. ForkJoin框架

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

  3. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  4. Sql清理日志文件

    场景: 我们导入MR数据时发现磁盘空间不够用了,导致的结果就是我们的程序很可能会抛出异常了,我们需要导入数据的时候进行日志瘦身. 问1:导入数据的时候,瘦身是否会造成数据库的异常? DBA提供解决方案 ...

  5. JQuery下CheckBox全选全不选反选

    <script src="JS/jquery-1.7.1.js"></script> <script type="text/javascri ...

  6. php 警告

    php.ini error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT error_log = /var/log/php-fpm/php ...

  7. it精英的艰辛路程

    我出生在呼和浩特市,但我并不是蒙古族人,而是彻彻底底的汉族人.我父亲小时候因为家里穷,十八九岁就独自出来闯荡了,后来在呼和浩特市发展的不错,还遇到了我妈,就定居下来了,结婚两年后就有了我. 小时候的家 ...

  8. 17---Net基础加强

    更新中,敬请期待............ 复习 将xml显示到treeview 修改增加 删除 foreach原理 深拷贝与浅拷贝 模拟数据库及登陆 复习总结

  9. (第九周)视频发布及git统计报告

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 代码地址:HTTPS: https://git.coding.net/li_yuhuan/FoodChain. ...

  10. 解决 “invalid resource directory name”, resource “crunch”

        try this: from the menu click Project->Clean... a popup window will appear. select the check ...