题意:

      给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案。

思路:

      状态压缩dp,记录方案数的地方我用的是类似并查集的方法,记录当前状态是那个状态转移过来的,<输出的时候可以 异或 出来>,对于字典序最小,这个比较好处理,给的是升序的,所以直接更新的时候记录就行了,<如果没给可以sort下>,我是开了一个dp[i]表示i状态时的最小扣分,然后在开一个数组time[i],记录dp[i]是对应的当前时间,然后每一个状态都用n个作业更新下,的到最优就行了,下面给出关键代码和ac代码

for(j = 0 ;j <= (1 << n) - 1 ;j ++)

for(i = 1 ;i <= n ;i ++)

{

   int tt = time[j] + node[i].cost - node[i].end;

   if(tt < 0) tt = 0;

   if(dp[j|(1<<(i-1)))] > dp[j] + tt)

   {

       mer[j|(1<<(i-1))] = j;//记录路径

        dp[j|(1<<(i-1))] = dp[j] + tt;

      time[j|(1<<(i-1))] = time[j] + node[i].cost;

   }

}

答案等于 dp[(1<<1)-1] 

然后是输出路径    

int x = (1 << n) - 1;

int id = 0;

while(x != mer[x])

{

   Ans[++id] = x ^ mer[x];

   x = mer[x];

}

for(i = n ;i >= 1 ;i --)

printf("%s\n" ,node[log2(Ans[i])+1].str);   





#include<stdio.h>
#include<string.h>
#include<math.h>

typedef struct
{
int
end ,cost;
char
str[110];
}
NODE; NODE node[20];
int
dp[1<<16];
int
Time[1<<16];
int
mer[1<<16];
int
Ans[20]; int minn(int x ,int y)
{
return
x < y ? x : y;
} int
maxx(int x ,int y)
{
return
x > y ? x : y;
} int main ()
{
int
t ,n ,i ,j;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d" ,&n);
for(
i = 1 ;i <= n ;i ++)
scanf("%s %d %d" ,node[i].str ,&node[i].end ,&node[i].cost);
for(
i = 0 ;i <= 1 << n ;i ++)
dp[i] = 1000000000 ,Time[i] = 0 ,mer[i] = i;
dp[0] = 0;
for(
j = 0 ;j <= (1 << n)-1 ;j ++)
for(
i = 1 ;i <= n ;i ++)
{
int
tt = Time[j] + node[i].cost - node[i].end;
if(
tt < 0) tt = 0;
if(
dp[j|(1<<(i-1))] > dp[j] + tt)
{

mer[j|(1<<(i-1))] = j;
dp[j|(1<<(i-1))] = dp[j] + tt;
Time[j|(1<<(i-1))] = Time[j] + node[i].cost;
}
}

printf("%d\n" ,dp[(1<<n)-1]);
int
x = (1<<n) - 1;
int
id = 0;
while(
x != mer[x])
{

Ans[++id] = x ^ mer[x];
x = mer[x];
}
for(
i = n ;i >= 1 ;i --)
printf("%s\n" ,node[int(log2(Ans[i]))+1].str);
}
return
0;
}

     

hdu1074 状态压缩dp+记录方案的更多相关文章

  1. HDU1074(状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

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

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

  3. HDU1074(KB12-D 状态压缩dp)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. HDU 1074 (状态压缩DP)

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

  5. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  6. POJ3254(入门状态压缩dp)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13203   Accepted: 6921 Desc ...

  7. 状态压缩·一(状态压缩DP)

    描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市——那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票—— ...

  8. 【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp

    题目描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 ...

  9. 状态压缩dp poj 3254 hdu5045

    近来感觉状态压缩dp的强大性(灵活利用了二进制运算非常关键). . . 于是做了俩提来看看..毕竟队友是专业的dp.我仅仅是管中窥豹下而已.. 日后有机会再与之玩耍玩耍...ps:假设上天再给我一次机 ...

随机推荐

  1. 聊聊IT技术人的知识体系

    我在我的2020年终总结中提到技术人需要建立自己的知识体系,那么怎么建立自己的知识体系呢?技术人的知识体系又是什么样的呢?今天,和你一一分享. 1 关于我的12字方针 我在我的<2020年终回顾 ...

  2. JAVA -JSON-XML-MAP转换

      //定义一个MAP对象,将对象传给后端接口接收 Map a = ["api": '11', ZGUID: "1231",BESKZ: "1231& ...

  3. 【java框架】MyBatis(7)--MyBatis注解开发

    1.MyBatis注解开发 1.1.Lombok的基本使用 Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/ ...

  4. C# 通过ServiceStack 操作Redis——Set类型的使用及示例

    ServiceStack 程序集里面没有方法注解,我在这里将注解添加上去,有不当之处,欢迎指正 Console.WriteLine("---Set类型---"); //添加 set ...

  5. Java 8 Stream API 详解

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (b ...

  6. mysql连接不上本地服务器或者localhost:3306报错

    今天初学MySQL数据库就遇到问题: 主要是本地服务器登录问题 workbench里双击那个connection出现的 解决方法: 1:看一看防火墙,这是最常见的,这种主要是防火墙限制了访问,可能是安 ...

  7. P1255_数楼梯(JAVA语言)

    思路:BigInteger 四杀! 简单递推,注意long会超范围 题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个 ...

  8. 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  9. python基础之流程控制(2)

    今天将是基础篇的最后一篇,咱们来补上最后一个内容,流程控制for循环 For 循环 一.为什么有for循环? for循环能做的事情,while循环全都可以实现,但是在某些情境下,for循环相对于whi ...

  10. Centos7安装maven详情以及配置

    一.maven安装: 1.获取maven下载地址: 查询maven最新版本地址:https://maven.apache.org/download.cgi 当前最新版本为maven 3.6.3    ...