http://acm.hdu.edu.cn/showproblem.php?pid=1074

我们可以断定状态的终止态一定是n个数全部选完的情况,那么它的前一个状态是什么呢,一定是剔除任一门课程后的n种状态。

例如

dp[全选了]=min{(dp[除了math都做了]+math的超时天数),(dp[除了computer都做了]+computer的超时天数),(dp[除了english都做了]+english的超时天数)}那么接下来的dp状态依然如此。

好了,接下来,我们该如何去思考了,这个题目共有2^15种可能情况,对此我们通过位运算的方法降低它的维度。

二进制的每一位代表一门课,它的组合可以完成展示出所有的状态。

最后我们应该去思考一个问题,顺序的问题,我们知道,第一次取得时候,一定只有一个课程,如果我们以

 int bit = <<n;
for(int i = ;i<bit;i++)

能否确保某一个状态的前一个都完全包含,你可以自己去检验,是完全满足的.

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = (<<)+;
const int INF = 0x3f3f3f;
struct node
{
char str[];
int d;//the deadtime
int c;//need spend time
};
node nd[];
int dp[MAXN],pre[MAXN],t[MAXN];
void output(int x)
{
if(!x)
return ;
output(x-(<<(pre[x]-)));
printf("%s\n",nd[pre[x]].str);
}
int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
memset(t,,sizeof(t));
memset(pre,,sizeof(pre));
//memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i = ;i<=n;i++)
{
scanf("%s%d%d",nd[i].str,&nd[i].d,&nd[i].c);
}
/* for(int i = 1;i<=n;i++)
{
printf("%s %d %d\n",nd[i].str,nd[i].d,nd[i].c);
}*/
int bit = <<n;
for(int i = ;i<bit;i++)
{
dp[i] = INF;
for(int j = n;j>=;j--)
{
int temp = <<(j-);
if(!(temp&i))
continue;
else
{
int dist = (t[i-temp]+nd[j].c-nd[j].d);
if(dist > )
{
if(dp[i]>(dp[i-temp]+dist))
{
t[i]=t[i-temp]+nd[j].c;
dp[i]=dp[i-temp]+dist;
pre[i] = j;
}
}
else
{
if(dp[i]>dp[i-temp])
{
t[i]=t[i-temp]+nd[j].c;
dp[i]=dp[i-temp];
pre[i] =j;
}
}
}
}
}
cout<<dp[bit-]<<endl;
output(bit-);
}
return ;
}

hdu 1074 状态压缩的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

  3. Doing Homework HDU - 1074 状态压缩

    #include<iostream> #include<cstring> #include<cstdio> #include<string> #incl ...

  4. hdu 4739(状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739 思路:状态压缩. #include<iostream> #include<cs ...

  5. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  6. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  7. hdu 1565(状态压缩基础题)

    题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...

  8. HDU 2553 状态压缩

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. hdu 3006(状态压缩)

    The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. GitHub提示 Error: Key already in use解决办法

    GitHub提示 Error: Key already in use解决办法GitHub提示 Error: Key already in use解决办法2014年09月05日 ⁄ 综合 ⁄ 共 290 ...

  2. Python基础(5)_字符编码、文件处理

    一.文件读取过程: 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数 ...

  3. 全自动安装mongoDB数据库的shell脚本

    最近在研究mongoDB数据库,写了个全自动安装mongoDB数据库的shell脚本,仅供参考,欢迎拍砖,内容如下: #!/bin/bash # shell的执行选项: # -n 只读取shell脚本 ...

  4. 【leetcode刷题笔记】Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 解题:设定一个变量 ...

  5. if-else 与 switch-case语句

    if语句就是起一个判断作用,在c语言中有三种表达形式:1.if(表达式)语句:pl.   if(x==y)printf("%d",x);         //*  "== ...

  6. Jboss添加Windows服务,同时定期重启

    一.添加成Windows服务 进入目录 \wildfly-9.0.2s - All\bin\service\ 编辑 service.bat,修改一下参数 set SHORTNAME=SAMEXAppS ...

  7. PLSQL Developer使用技巧整理

      Shortcut: =============================================================================== Edit/Und ...

  8. ava:Map借口及其子类HashMap三

    ava:Map借口及其子类HashMap三 HashMap常用子类(异步非安全线程,性能高: Hashtable:同步的安全线程,性能低) map(HashMap)中的key,value可以通过 Se ...

  9. window操作常识

  10. Python-单元测试unittest

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,概念见下: TestCase 也就是测试用例 Test ...