题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分。输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数。求出完成所有作业时所扣掉的分数最少,同时输出完成作业的顺序(若有多组结果,输出按字典序排列最小的那组)。(输入时,按名称的字典序输入)

思路 :题目中给出的 n 的范围很小,很明显是用状态压缩来求解。将一个整数分解成二进制形式。从左往右数起,第 i 位代表第 i 项作业的完成情况,1 代表完成,0代表未完成。

  #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff struct {
char name[102];
int d;
int c;
}course[16];
struct {
int score;
int day;
int pre;
int num;
}dp[1 << 16]; int main(){
int T,n,i,j,sum;
cin >> T;
while(T--){
cin >> n;
sum = 0;
for(i=0;i<n;i++){
scanf("%s%d%d",course[i].name,&course[i].d,&course[i].c);
sum += course[i].c ;
}
dp[0].score = 0 ;
dp[0].day = 0 ;
for(i=1; i<(1<<n); i++){
dp[i].score = INF ;
for(j=n-1; j>=0; j--){
if(i&(1<<j)){
int ans = i - (1 << j);
int reduce = dp[ans].day + course[j].c - course[j].d;
if(reduce < 0)
reduce = 0 ;
if(reduce + dp[ans].score < dp[i].score){
dp[i].score = reduce + dp[ans].score ;
dp[i].num = j ;
dp[i].pre = ans ;
dp[i].day = dp[ans].day + course[j].c ;
}
}
}
}
printf("%d\n",dp[(1<<n)-1].score);
char ch[16][102];
int t = (1<<n)-1 ,top = 0 ;
while(t){
strcpy(ch[top++],course[dp[t].num].name);
t = dp[t].pre;
}
while(top)
printf("%s\n",ch[--top]);
}
return 0;
}

HDU 1074 Doing Homework (状态压缩 DP)的更多相关文章

  1. HDU 1074 Doing Homework(状态压缩DP)

    题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. #include<iostream& ...

  2. hdu1074 Doing Homework(状态压缩DP Y=Y)

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

  3. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  4. HDU 1074 Doing Homework(像缩进DP)

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  5. HDU 3001 Travelling(状态压缩DP+三进制)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...

  6. hdu 4057(ac自动机+状态压缩dp)

    题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...

  7. hdu 2825(ac自动机+状态压缩dp)

    题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...

  8. Hdu 4778 Gems Fight! (状态压缩 + DP)

    题目链接: Hdu 4778 Gems Fight! 题目描述: 就是有G种颜色,B个背包,每个背包有n个宝石,颜色分别为c1,c2............两个人轮流取背包放到公共容器里面,容器里面有 ...

  9. HDU1074 Doing Homework 状态压缩dp

    题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 /* 首先要明白的一点是状态1/0分别表示这件事做了还是没做 而1/0的位 ...

随机推荐

  1. virsh -c exs://ip/?no_verify=1 --readonly nodeinfo

  2. 深入理解linux网络技术内幕读书笔记(四)--通知链

    Table of Contents 1 概述 2 定义链 3 链注册 4 链上的通知事件 5 网络子系统的通知链 5.1 包裹函数 5.2 范例 6 测试实例 概述 [注意] 通知链只在内核子系统之间 ...

  3. SVN 一次性提交多个目录中文件

    情况一:将项目中未加入版本控制的文件提交到版本库. 在使用WINDOW下的SVN客户端工具时,在提交一个项目的文件时,如果有未加入版本库的文件,这时可以先将未加入的文件选中,然后一起提交. 但在LIN ...

  4. c语言指针点滴1

    #include <stdio.h> #include <stdlib.h> void main() { int *p = NULL;//指针开始最好都初始化为空 if(p = ...

  5. html5标签收集

    <meta name="viewport" content="width=device-width,initial-scale=1 user-scalable=0& ...

  6. java 版本SQLHelper

    package com.jack.SQLHelper; import java.sql.*;import java.util.logging.*;import javax.swing.table.*; ...

  7. ZigBee心电传输(二)

    不管怎样,还是在高手的帮助下完成了前面的硬件部分,现在进行ZigBee的心电AD采集和转换.需要把ZigBee重新拾起来. 首先明确下目标和思路吧,目标是将模拟心电信号通过AD转换,变为数字信号,再用 ...

  8. CSMA/CD协议

    为了通信的简便,以太网采取了两种重要的措施: 第一:采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据: 第二:以太网对发送的数据帧不进行编号,也不要求对方发回确认. 因此,以太网提供 ...

  9. oracle之replace结合substr的使用

    select * from( SELECT TMM.ORDER_ID, TMM.IMPORT_ID, TMM.TMALL_ORDER_ID, TMM.MEMBER_NAME, TMM.ALIPAY_U ...

  10. OkHttp 上手

    OkHttp 上手 优点 快.节省带宽. 支持 HTTP/2 和 SPDY. HTTP/2 和 SPDY 允许对同一个主机的所有请求,使用一个 socket. 如果不支持 SPDY 的话,可以用连接池 ...