码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-03-28][HDU][1074][Doing Homework]

时间:2016-04-01 23:21:06      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-03-28 18:46:36 星期一

  • 题目编号:[2016-03-28][HDU][1074][Doing Homework]

  • 题目大意:给定n门科作业的期限时间和完成耗时,每科每超过一天就扣一份,求最少扣分数

  • 分析:n只有15,二进制枚举,状态压缩,枚举每种科目完成的状态,更新下一个状态,求最小值

  1. #include <cstring>
  2. #include <cstdio>
  3. using namespace std;
  4. const int maxstu = 1 << 16;
  5. struct Cource{
  6. char name[20];
  7. int d,c;
  8. }a[16];
  9. struct mstatus{
  10. int pre,cost,reduced,id;
  11. mstatus(int a = 0,int b = 0,int c = 0,int d = 0):cost(a),reduced(b),pre(c),id(d){};
  12. }dp[maxstu];
  13. int vis[maxstu];
  14. void print(int cur){
  15. if(dp[cur].pre == 0){
  16. printf("%s\n",a[ dp[cur].id ].name);
  17. return ;
  18. }
  19. print(dp[cur].pre);
  20. printf("%s\n",a[ dp[cur].id ].name);
  21. }
  22. int main(){
  23. int T;
  24. scanf("%d",&T);
  25. while(T--){
  26. int n;
  27. scanf("%d",&n);
  28. for(int i = 0;i < n;++i){
  29. scanf("%s%d%d",a[i].name,&a[i].d,&a[i].c);
  30. }
  31. memset(vis,0,sizeof(vis));
  32. dp[0] = mstatus(0,0,0,0);
  33. for(int i = 0;i < (1 << n) - 1;++i){
  34. for(int j = 0;j < n;++j){
  35. int cur = 1 << j;
  36. if((cur & i) == 0){
  37. int curcost = dp[i].cost + a[j].c;
  38. int curreduced = dp[i].reduced + (curcost <= a[j].d?0:curcost - a[j].d);
  39. int nxtstatus = cur | i;
  40. if(vis[nxtstatus]){
  41. if(curreduced < dp[nxtstatus].reduced){
  42. dp[nxtstatus] = mstatus(curcost,curreduced,i,j);
  43. }
  44. }else {
  45. vis[nxtstatus] = 1;
  46. dp[nxtstatus] = mstatus(curcost,curreduced,i,j);
  47. }
  48. }
  49. }
  50. }
  51. int ans = dp[(1 << n) - 1].reduced;
  52. printf("%d\n",ans);
  53. print((1 << n) - 1);
  54. }
  55. return 0;
  56. }




[2016-03-28][HDU][1074][Doing Homework]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/f6076d08ccffb442cb4b8f437e2d76cf.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!