Doing Homework

HDU - 1074

这是一道状态压缩DP(从N <= 15就可以看出来)。

我们定义二进制状态S代表的是目前已经安排好的任务

dp[S].val代表的是目前已经安排好的任务的扣分的最小值

dp[S].sumT代表的是目前已经安排好的任务所需要的时间

状态转移的时候我们只考虑下一个任务的选取

设S通过新任务的选取转移到下一个状态tar

tar = S | (1<<i) ;选取第i个任务

那么状态转移一可以写成

if(dp[S].sumT + Ts[i] > ddls[i])//当新任务的选取超过了ddl而被扣分,那么计算扣分cost = dp[S].sumT + Ts[i] - ddls[i];

if(dp[tar].val > dp[S].val + cost ){//更新dp[tar].val = dp[S].val + cost;dp[tar].sumT = dp[S].sumT + Ts[i];dp[tar].pre = S;//设置前驱,记录路径
}

完整代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{int sumT;int val;int pre;
};
node dp[(1<<15)];
const int INF = 1e9;
const int MAX = 20;
int ddls[MAX];
int Ts[MAX];
char names[MAX][100];
int order[16];
int calc(int x){int cnt = 0;while(x){cnt++;x >>= 1;}return cnt-1;
}
int main(){int T;scanf("%d",&T);while(T--){for(int i = 0;i < (1<<15);i++){dp[i].val = INF;}int n;scanf("%d",&n);for(int i = 0;i < n;i++){scanf("%s %d%d",names[i],&ddls[i],&Ts[i]);}dp[0].pre = 0;dp[0].sumT = 0;dp[0].val = 0;for(int S = 0;S < (1<<n);S++){for(int i = 0;i < n;i++){if((S & (1<<i)) == 0){int tar = S|(1<<i);int cost = 0;if(dp[S].sumT + Ts[i] > ddls[i])cost = dp[S].sumT + Ts[i] - ddls[i];if(dp[tar].val > dp[S].val + cost ){dp[tar].val = dp[S].val + cost;dp[tar].sumT = dp[S].sumT + Ts[i];dp[tar].pre = S;}}}}cout<<dp[(1<<n)-1].val<<endl;int S = (1<<n)-1;int cnt = n;while(S){int nS = dp[S].pre;int t = calc(nS ^ S);order[--cnt] = t;S = nS;}for(int i = 0;i < n;i++){cout<<names[order[i]]<<endl;}}return 0;
}

动态规划训练16 [Doing Homework HDU - 1074 ]相关推荐

  1. Doing Homework HDU - 1074

    Doing Homework HDU - 1074 题意: 有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分. 求如何安排任务,使得扣的分数最少. (1<=n<=15) 题 ...

  2. 动态规划训练18 [免费馅饼 HDU - 1176 ]

    免费馅饼 HDU - 1176 这也是一道比较简单的动态规划 dp[i][j]表示到时间i,位置为j所能采集的最大馅饼数量 状态转移非常好写 dp[i][j] = max{dp[i-1][j],dp[ ...

  3. 动态规划训练11 [String painter HDU - 2476]

    String painter HDU - 2476 题意: 我认为这是一道比较难的问题,自己想了很久,没有想出来怎么做,可能是因为思维僵化吧,一直在想怎么直接的由A变到B,事实上,可以有中间桥梁连接A ...

  4. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  5. 动态规划训练24 [Phalanx HDU - 2859 ]

    Phalanx HDU - 2859 这是一道非常好的题目,我实在是没想到该怎么做,看了一下大神的题解才恍然大悟(还有这种操作?) 由于对称矩阵是以对称轴进行对称的(废话),所以我们可以用dp[i][ ...

  6. 动态规划训练21 [FatMouse and Cheese HDU - 1078 ]

    FatMouse and Cheese HDU - 1078 这道题需要说一说,定义dp[x][y]表示从点(x,y)出发,每次走不超过k步,所能吃到的最大量. 有点难搞的是,这里递归的顺序不好确定, ...

  7. 动态规划训练17 [Super Jumping! Jumping! Jumping! HDU - 1087 ]

    Super Jumping! Jumping! Jumping! HDU - 1087 过于简单懒得说了 #include <cstdio> #include <algorithm& ...

  8. 动态规划训练15 [Monkey and Banana HDU - 1069 ]

    Monkey and Banana HDU - 1069 题意大致是将一个长方体通过旋转,使得摞起来的建筑最高.但是必须满足这么一个条件,那就是上面的长方体的底面一定要完全被下一个长方体的底面完全覆盖 ...

  9. 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]

    Max Sum Plus Plus HDU - 1024 题意大致是说给你你个序列,把它划分成不相交的几个连续的部分,然后把这个几个部分求和,求出和的最大值. 我们定义子结构  dp[i][j]  表 ...

最新文章

  1. Git GUI使用(二)
  2. 高清还原破损视频,参数和训练时间减少三分之二,台大这项研究登上了BMVC 2019...
  3. 复习Java_List_Set_HashSet原理_Collections使用_Comparator使用
  4. unity隔一段时间再显示_Unity3D内置倒计时!从此再不拖延!
  5. 数据结构之栈的应用:递归
  6. c++:多线程的创建和unique_lock<mutex>的使用
  7. 创建查看mysql8.0数据库_创建和选择数据库
  8. 中科大EPC课程爬取
  9. iPhone提示“软件更新失败”下载时出错怎么办?教你解决!
  10. 交换游戏(状态压缩、记忆化搜索)
  11. 可以免费下载视频素材和模板网站汇总
  12. 【电子书资源】 PDF格式 持续更新
  13. Java、JSP物流车辆调度系统
  14. 艾宾浩斯遗忘曲线PHP,艾宾浩斯遗忘曲线计划表打印版
  15. Bokeh可视化图表使用教程
  16. 反射是什么,以及作用
  17. Android12 WMS启动流程
  18. in、or、exists区别
  19. MEGA16游戏开发板驱动
  20. 【SubPhaser-多倍体亚基因组分型流程解读】

热门文章

  1. java类同步_Java中方法,对象,类的同步
  2. leetcode1047. 删除字符串中的所有相邻重复项
  3. [RabbitMQ]MQ 的分类
  4. [数据结构-严蔚敏版]P37定义一个带头结点的线性链表
  5. C++继承同名静态成员处理
  6. ueditor单图上传iframe跨域_UEditor单图上传(simpleupload)跨域问题解决方案
  7. Zookeeper:基于Zookeeper的分布式锁与领导选举
  8. F - Sugoroku2(动态规划)
  9. 【ZJOI2019】线段树【线段树上dp】【大讨论】
  10. Educational Codeforces Round 96 (Rated for Div. 2) C. Numbers on Whiteboard///思维