HDU 1074 Doing Homework(状态压缩dp)
2016-01-22 17:28
495 查看
题目链接:[kuangbin带你飞]专题十二 基础DP1 D - Doing Homework
先大致说说状态压缩,假设有三门作业a,b,c
那么,abc都做完即111,111可由101,110,011任意一个来得到。而101可以从100或者001来得到,这就是状态压缩dp的一个基本的状态转移。
之前自己一直奇怪二进制10串怎么能跟全排列扯上关系,相通上面那么思路,当然就迎刃而解。
题意
有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名排列最小的一个。思路
利用二进制位的方法来解题用过不少次,但真正意义上的状态压缩dp,这是第一道,有纪念意义,当然,一开始也没想出来,看了前人思路才恍然大悟。先大致说说状态压缩,假设有三门作业a,b,c
那么,abc都做完即111,111可由101,110,011任意一个来得到。而101可以从100或者001来得到,这就是状态压缩dp的一个基本的状态转移。
之前自己一直奇怪二进制10串怎么能跟全排列扯上关系,相通上面那么思路,当然就迎刃而解。
代码
[code]#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> #include<stack> #include<queue> using namespace std; const int N = 16; struct Node { char str[109]; int want, need; }node ; struct DP { int now, sum, next, pos; }dp[1<<N]; void put_ans(int x) { if(dp[x].next != -1) { put_ans(dp[x].next); printf("%s\n", node[dp[x].pos].str); } } int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%s%d%d", node[i].str, &node[i].want, &node[i].need); dp[0].now = dp[0].sum = 0; dp[0].next = dp[0].pos = -1; int m = (1<<n)-1; for(int i=1; i<=m; i++) { dp[i].sum = 0x3f3f3f3f; for(int j=0; j<n; j++) { if((1<<j) & i) { int k = i - (1<<j); int v = dp[k].now + node[j].need - node[j].want; v = max(v, 0); if(dp[i].sum >= dp[k].sum+v) { dp[i].sum = dp[k].sum + v; dp[i].now = dp[k].now + node[j].need; dp[i].next = k; dp[i].pos = j; } } } } printf("%d\n", dp[m].sum); put_ans(m); } return 0; }
相关文章推荐
- ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
- mysql kill process解决死锁
- java多线程
- LeetCode 260:Single Number III
- 刚踏上管理岗位,如何短时间树立威信,快速提高领导力?
- 字符设备驱动程序的设计
- (安全系列一)Android Apk反编译得到Java源代码
- 解决有java命令,没有javac命令
- 数据结构-单链表的java实现
- Matlab—Matlab操作mysql数据库
- 正向代理 & 反向代理
- 玩转swift(二)
- JSP SHELL有关的whoami漏洞
- hud-2821-Pusher
- Myeclipse10下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3
- 费伯纳西数列(Fibonacci)的输出
- 常用的二种修改mysql最大连接数的方法
- oschina的android源码分析学习-MainActivity
- Linux与JVM的内存关系分析
- 图的基础算法-广度优先搜索/深度优先搜索