Doing Homework HDU - 1074

题意:

有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分。
求如何安排任务,使得扣的分数最少。
(1<=n<=15)

题解:

n很小,可以往状压dp方向去想
我们用i枚举所有的状态,然后对于第j个任务,tmp=i-(1<<j),tmp表示状态i在未完成j的前一个状态
tim[]表示当前状态所花费的时间,那么完成第j个任务所扣分数为score=tim[tmp]+cost[j]-dead[j],完成tmp所需时间+完成任务j所需时间-截止日期,超出多少扣多少分数
dp[i]表示i状态下的的最小扣分,dp[i]=min(dp[tmp]+score)
为了方便答案的输出,我们用pre[i]记录,最后一个完成状态i所办的任务,pre[i]=j,这样记录是为了之后方便输出,w=i-(1<<pre[i])就是在任务j之前的状态,然后依次寻找w-(1<<pre[w])
在循环任务j时,要从后向前找,因为题目所给的数据是字典序递增的,而我们最后的输出是根据pre倒着输出的,所以逆着寻找可以保证输出的字典序最小

代码:

我的代码不知道哪里错了,一直wa,先贴上网上的正代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 15
#define MOD 10007
#define E 1e-6
#define LL long long
using namespace std;
char str[20][101];
int dp[1<<N],pre[1<<N],times[1<<N];
int dead[N],cost[N];
void print(int x){//递归输出作业顺序if(!x)return;print(x-(1<<pre[x]));printf("%s\n",str[pre[x]]);
}
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",&str[i],&dead[i],&cost[i]);memset(times,0,sizeof(times));memset(pre,0,sizeof(pre));for(int i=1;i<(1<<n);i++){//枚举所有状态dp[i]=INF;//初始化状态i的扣分for(int j=n-1;j>=0;j--){//从后向前找int temp1=1<<j;if(!(i&temp1))//状态i不存在作业j完成的情况continue;int temp2=i-temp1;//未完成作业j的状态int score=times[temp2]+cost[j]-dead[j];//计算扣分if(score<0)//最小扣分为0score=0;if(dp[i]>dp[temp2]+score){dp[i]=dp[temp2]+score;//记录最小扣分times[i]=times[temp2]+cost[j];//到达状态i所花费的时间pre[i]=j;//状态i的前驱}}}printf("%d\n",dp[(1<<n)-1]);print((1<<n)-1);}return 0;;
}

Doing Homework HDU - 1074相关推荐

  1. 动态规划训练16 [Doing Homework HDU - 1074 ]

    Doing Homework HDU - 1074 这是一道状态压缩DP(从N <= 15就可以看出来). 我们定义二进制状态S代表的是目前已经安排好的任务 dp[S].val代表的是目前已经安 ...

  2. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  3. hdu 1074 状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...

  4. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  5. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  6. [kuangbin]专题12 基础DP

    HDU 1024 Max Sum Plus Plus HDU 1029 Ignatius and the Princess IV HDU 1069 Monkey and Banana HDU 1074 ...

  7. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  8. SDU程序设计思维实践题目总结

    题目来源及链接 题目名称及讲解博客链接 涉及算法 原题以及原题链接 第二周作业 Maze BFS POJ-3984 Pour water BFS POJ-1606 第二周实验 化学 模拟 codefo ...

  9. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

最新文章

  1. 基于 CoreText 实现的高性能 UITableView
  2. springboot部署war包为什么tomcat会启动两次
  3. mybatis 一对一 一对多 级联查询
  4. .so文件反编译_java加密防止反编译-VirboxProtector
  5. 【Siddhi】Siddhi的语法关键字
  6. glassfish linux,Linux下实现GlassFish自动启动
  7. 如何在C++中集成LUA脚本(LuaWrapper For C++篇)
  8. org.springframework.web.servlet.view.ContentNegotiatingViewResolver
  9. 3.3通过EmbeddedServletContainerCustomizer调用Tomcat
  10. 【深度学习笔记】(一)Octave
  11. 数学建模算法与应用 数理统计
  12. matlab画图基本命令
  13. 使用dea-toolbox进行数据包络分析
  14. oracle混音插件教程,编辑推荐:7款人声混音插件
  15. 国产服务器虚拟化产品,国内主流虚拟化厂商之间比较.doc
  16. C# 字节(数组)与位之间的计算
  17. dns域名解析原理及过程
  18. SAP_ABAP_采购价格条件报表
  19. 「击败星际争霸II职业玩家」的 AlphaStar是在作弊?
  20. Photoshop制作宠物小精灵球主题图标教程

热门文章

  1. 老娘不就是没化妆吗?你几个意思?
  2. 兄弟,就你这智商就别出轨了吧?
  3. 变态公式之如何算出圆的内部被切割成几块?
  4. 如何逼疯一名数学系学生?
  5. 每日一笑 | 最真实的商业模式
  6. 159个故事串起三千年大历史!这套“儿童版史记”太无敌了!
  7. 还在集什么五福,史上最惨锦鲤再次来袭!奖品堪比5年高考3年模拟!
  8. 看见到洞见之引子(一)机器学习算法
  9. 全景图解高铁数据,谁是最有潜力的高铁城市?
  10. linux重定向输出时加时间变量,shell 重定向错误输出到文件 加上时间(标明错误抛出的时间)...