Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65450
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:42:24

 

有n个作业,a1,a2…..an,作业aj的处理时间为tj,产生的效益为pj,最后完成期限为dj,作业一旦被调度则不能中断,如果作业aj在dj前完成,则获得效益pj,否则无效益。给出最大化效益的作业调度算法。

Hulu的一道笔试题。
来源:

我们记作业处理时间为cost[],效益为value[],完成期限为deadline[],总时间限制为time。

先来分析题目。题目变量很多,因为每个任务都只能被执行一次。直观感受应该是一个0-1背包问题。

首先我们先刨去完成期限不考虑。n个作业相当于n个物品,效益相当于每个物体的重量,处理时间则相当于物品的体积。我们有time长的时间可以运行,那么time就相当于背包的容量。这时,这就变成了一个典型的0-1背包问题。
再来回忆典型的0-1背包的处理。在背包容量为v的时候,我们决定对于一个物品i,是否可以放入的条件是v容量足以放下物品i以及前置物品。同样的,回到这道题目,在t时间点时,我们决定是否能将一个任务i加入到序列中,条件是t足够完成任务i和其前置任务,任务之外,还要考虑,在加入任务i后,完成的时间不能超过任务i的最后期限。

f[i][t]表示前i件任务在t时间段内执行可以获得的最大价值,参照基本的0-1背包的状态转移方程,有:
在不考虑完成期限时,其状态转移方程是:
        f[i][t] = max{f[i-1][t], f[i-1][t-cost[i]] + value[i]}
在考虑完成期限时,其状态转移方程是:
        f[i][t] = max{f[i-1][t],  (f[i-1][t-cost[i]] + value[i]|t<=deadline[i])}


示例代码如下。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(){
  5.     int tasks = 2;
  6.     int time = 10;
  7.         //-1为占位符
  8.     int cost[] = {-1,1,4};
  9.     int value[] = {-1,10,6};
  10.     int deadline[] = {-1,5,4};
  11.     int maxvalue = 0;

  12.     int tmp[tasks+1][time+1];
  13.     memset(tmp, 0, sizeof(int)*(tasks+1)*(time+1));

  14.     int task = 1;
  15.     for(;task<=tasks;task++){
  16.                 int t;
  17.         for(t=1;t<=time;t++){
  18.             if(t>deadline[task])
  19.                 continue;
  20.             if(t>=cost[task]){
  21.                 tmp[task][t] = tmp[task-1][t];
  22.                 if((tmp[task-1][t-cost[task]+1] + value[task])> tmp[task][t])
  23.                     tmp[task][t] = tmp[task-1][t-cost[task]+1] + value[task];
  24.                 printf("%d %d = %d n", task, t, tmp[task][t]);
  25.                 maxvalue = maxvalue<tmp[task][t]? tmp[task][t]:maxvalue;
  26.             }
  27.         }
  28.     }

  29.     printf("max = %d n", maxvalue);
  30. }


阅读(582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~