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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<queue>
  6. #include<algorithm>
  7. #include<cmath>
  8. #include<map>
  9. using namespace std;
  10. #define INF 0x7fffffff
  11. struct {
  12. char name[102];
  13. int d;
  14. int c;
  15. }course[16];
  16. struct {
  17. int score;
  18. int day;
  19. int pre;
  20. int num;
  21. }dp[1 << 16];
  22. int main(){
  23. int T,n,i,j,sum;
  24. cin >> T;
  25. while(T--){
  26. cin >> n;
  27. sum = 0;
  28. for(i=0;i<n;i++){
  29. scanf("%s%d%d",course[i].name,&course[i].d,&course[i].c);
  30. sum += course[i].c ;
  31. }
  32. dp[0].score = 0 ;
  33. dp[0].day = 0 ;
  34. for(i=1; i<(1<<n); i++){
  35. dp[i].score = INF ;
  36. for(j=n-1; j>=0; j--){
  37. if(i&(1<<j)){
  38. int ans = i - (1 << j);
  39. int reduce = dp[ans].day + course[j].c - course[j].d;
  40. if(reduce < 0)
  41. reduce = 0 ;
  42. if(reduce + dp[ans].score < dp[i].score){
  43. dp[i].score = reduce + dp[ans].score ;
  44. dp[i].num = j ;
  45. dp[i].pre = ans ;
  46. dp[i].day = dp[ans].day + course[j].c ;
  47. }
  48. }
  49. }
  50. }
  51. printf("%d\n",dp[(1<<n)-1].score);
  52. char ch[16][102];
  53. int t = (1<<n)-1 ,top = 0 ;
  54. while(t){
  55. strcpy(ch[top++],course[dp[t].num].name);
  56. t = dp[t].pre;
  57. }
  58. while(top)
  59. printf("%s\n",ch[--top]);
  60. }
  61. return 0;
  62. }

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. bzoj3038 上帝造题的七分钟2

    Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...

  2. Permutations 解答

    Question Given a collection of numbers, return all possible permutations. For example,[1,2,3] have t ...

  3. HashMap Collision Resolution

    Separate Chaining Use data structure (such as linked list) to store multiple items that hash to the ...

  4. hdu 4983 Goffi and GCD(欧拉函数)

    Problem Description Goffi is doing his math homework and he finds an equality on his text book: gcd( ...

  5. Css中的变形及过渡动画

    在css3的标准中新增加了变形样式,这些样式使得网页中各元素的位置形状的变换变得更加容易.其语法如下: transform:none | <transform-function>+ 其中对 ...

  6. class 类(4)

    要将类实例化,然后通过实例来调用类的方法(函数).在此,把前面经常做的这类事情概括一下: 方法是类内部定义函数,只不过这个函数的第一个参数是self.(可以认为方法是类属性,但不是实例属性) 必须将类 ...

  7. Windows下模拟Linux开发

    1.背景 Linux环境下开发是大势所趋,也是开发者必须掌握的技能.然windows系统已深入人心,实在不想放弃windows下的成熟应用,因此可以在Windows上模拟一个Linux系统.这样就满足 ...

  8. JSP中getParameter和getAttribute区别

    (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方法 (2)当两个Web组件之间为链接关系时,被链接的组件通过getParameter ...

  9. Java 下各种设计模式小结

    策略模式--定义算法族,分别封装起来,让它们之间能够互相替换,此模式让算法的变化独立于使用算法的客户.     策略模式是说,针对一种计算,定义一系列的算法,由用户决定详细使用哪一个算法完毕计算. 比 ...

  10. Win7访问局域网内共享文件夹

    \\192.168.1.102\\IP地址