题意:

      给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把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. 关于MarkDown语法

    Markdown语法 码云笔记链接:https://gitee.com/out_of_zi_wen/practical-experience/blob/master/Markdown%E8%AF%AD ...

  2. 关于css垂直水平居中的几种方式

    css中元素的垂直水平居中是比较常见及较常使用的,在这里向大家介绍一下几种方式. 1.水平居中 margin: 0 auto; 效果图: 而文字的垂直水平居中也比较简单,加上line-height: ...

  3. Less常用变量与方法记录

    需求:仅记录Lsee常用变量与方法定义,便于使用.-- @color: #000; @title-color: #000; @bg-color: #fff; @small-font: 12px; @l ...

  4. Lzzy高级语言程序设计之for循环

    public class Mq { public static void main(String[]args){ int a = 3 ; a++;// do{ System.out.println(& ...

  5. CMU15-455 Lab2 - task4 Concurrency Index -并发B+树索引算法的实现

    最近在做 CMU-15-445 Database System,lab2 是需要完成一个支持并发操作的B+树,最后一部分的 Task4 是完成并发的索引这里对这部分加锁的思路和完成做一个总结,关于 B ...

  6. Cup HDU - 2289

    题目传送门:https://vjudge.net/problem/HDU-2289 题意:有一个上口小于底部的圆台形水杯,告诉我们水的体积求水高度. 思路:利用高中数学知识求rr然后二分求h,具体化简 ...

  7. 【linux】驱动-3-字符设备驱动

    目录 前言 3. 字符设备驱动 3.1 Linux设备分类 3.2 设备相关概念 3.2.1 设备号 3.2.2 设备节点 3.2.3 APP open 文件理解 ** 3.3 数据结构 3.3.1 ...

  8. Trie、并查集、堆、Hash表学习过程以及遇到的问题

    Trie.并查集.堆.Hash表: Trie 快速存储和查找字符串集合 字符类型统一,将单词在最后一个字母结束的位置上打上标记 练习题:Trie字符串统计 import java.util.*; pu ...

  9. RabbitMQ 入门 (Go) - 3. 模拟传感器,生成数据并发布

    现在,我们需要模拟传感器,生成数据,并发布到 RabbitMQ. 建立传感器项目 在 GOPATH src 下建立文件夹 sensors,使用 go mod init 初始化,并创建 main.go. ...

  10. 使用 Android Studio 开发 widget 安卓桌面插件

    •What AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序: 这么说可能有点抽象,看图: 像这种,桌面上的天气.时钟.搜索框等等,都属于 APP Wi ...