【状态DP】 HDU 1074 Doing Homework
原题直通车:HDU 1074 Doing Homework
题意:有n门功课需要完成,每一门功课都有时间期限t、完成需要的时间d,如果完成的时间走出时间限制,就会被减
(d-t)个学分。问:按怎样的顺序做才能使得学分减得最少。
分析:因为n<=15数据比较小,可以用状态DP做。状态k(若k&(1<<j)==1表示第j门功课已经完成,反之未完成),
状态数最多为(1<<16)-1,每个状态k可由状太r(r<k, r&(1<<j)==0且k&(1<<j)==1, 其中0<j<n )得到。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn=1<<17;
const int inf=0xFFFFFFF; struct node{
char s[105];
int t; //限制时间
int d; //完成时间
void read(){
scanf("%s%d%d",s,&t,&d);
}
}g[20]; struct DP{
int w; //扣的总学分
int sd; //总完成时间
int next, mj;
}dp[maxn]; char ans[20][105]; int main(){
int T; scanf("%d",&T);
while(T--){
int n; scanf("%d",&n);
for(int i=0;i<n;++i) g[i].read();
dp[0].next=-1; dp[0].w=0; dp[0].sd=dp[0].st=0;
int m=1<<(n+1);
for(int i=1;i<m;++i){
dp[i].w=inf;
for(int j=n-1;j>=0;--j)
if((i>>j)&1){
int k=i-(1<<j);
int c=dp[k].w;
if(g[j].d+dp[k].sd>g[j].t) c+=g[j].d+dp[k].sd-g[j].t;
if(dp[i].w>c){
dp[i].w=c; dp[i].next=k; dp[i].mj=j;
dp[i].sd=dp[k].sd+g[j].d;
}
}
}
int u=0;
for(int i=0;i<n;++i) u|=(1<<i);
printf("%d\n",dp[u].w);
int d=0;
while(true){
strcpy(ans[d++],g[dp[u].mj].s);
u=dp[u].next;
if(u==0) break;
}
while(d) printf("%s\n", ans[--d]);
}
return 0;
}
【状态DP】 HDU 1074 Doing Homework的更多相关文章
- HDU 1074 Doing Homework (动态规划,位运算)
HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- HDU 1074 Doing Homework【状态压缩DP】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...
- HDU 1074 Doing Homework (状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接 Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot ...
- HDU 1074 Doing Homework (状态压缩 DP)
题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...
- HDU 1074 Doing Homework(DP状态压缩)
题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最 ...
- HDU 1074 Doing Homework(状态压缩DP)
题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. #include<iostream& ...
- HDU 1074 Doing Homework ——(状态压缩DP)
考虑到n只有15,那么状压DP即可. 题目要求说输出字典序最小的答案的顺序,又考虑到题目给出的字符串本身字典序是递增的,那么枚举i的时候倒着来即可.因为在同样完成的情况下,后选字典序大的,小的字典序就 ...
随机推荐
- 用Verilog实现IIC通讯
注意,此代码是错误代码,并不能实现想要的结果. 之所以留着,因为里面的enable 是独立开来的思想值得借鉴.就是控制单元和运算单元分开(我也是借鉴别人的实现思想).具体用verilogHDL实现II ...
- 执行Git命令时出现 SSL certificate problem 的解决办法
比如我在windows下用git clone gitURL 就提示 SSL certificate problem: self signed certificate 这种问题,在windows下出现 ...
- HDU 4740 模拟题意
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711743 题意:驴和老虎在方格中跑,跑的方式:径直跑,若遇到边界或之前走过的 ...
- linux stat系统调用,获取文件信息。
stat 函数原型: int stat(const char *path, struct stat *buf); struct stat 说明 struct stat { mode_t st_mode ...
- C++第13周(春)项目1 - 点、圆的关系
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目1 - 点.圆的关系](1)先建立一个P ...
- ant 关键字和关键语句
学习ant推荐的两个blog http://www.cnblogs.com/huozhicheng/archive/2010/04/08/2533199.htmlhttp://www.cnblogs. ...
- centos安装python gcc sqlite
终端中输入命令:yum install gcc -y yum install python -y yum install sqlite -y
- Ubuntu一些配置和技巧
安装google-chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb sudo d ...
- 【floyd】HDU 1874 畅通project续
之后的题解偏重有用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也能够放放. 非常久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话能够分为下面几种. 1.单源最短路 ...
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...