zoukankan      html  css  js  c++  java
  • 算法导论157 达到最高效益的调度

    【转】

    问题: 假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个 时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后 才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。

    ——————————
    分析:
    其实这个问题类似于01背包问题。
    1.    将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0=0。
    2.    构建数组s[n][d[n]],s[i][j]代表在j时间内,调度i个作业,所得最高效益值。初始时,令s[i][0] = 0(i = 0->n),s[0][j] = 0(j = 0->d[n])。
    3.    求s[i][j]的值,select[i][j]用于记录是否选择i。这里递归包含了一种思想:如果第i个作业被调度,那么最好使其在期限时正好结束,这样能够保证i之前的作业能够在更充裕的时间内被调度。

        for i = 1->n  
    for j = 1->d[i]
    //不调度i
    s[i][j] = s[i-1][min(j, d[i-1])]
    select[i][j]
    = false
    //调度i
    if j>t[i]
    if s[i][j] < s[i-1][min(j-t[i], d[i-1])]+p[i]
    s[i][j]
    = s[i-1][min(j-t[i], d[i-1])]+p[i]
    select[i][j]
    = true

    4.    最终s[n][d[n]]即为所求最高效益值。如果要求出所调度的作业序列,可以通过select取得。

    注意d[i-1][j] 中j最多到达d[i-1], 所以要min(j-t[i], d[i-1])!!

  • 相关阅读:
    poj 3714 Raid(平面最近点对)
    hdu 4638 Group(离线+树状数组)
    UVa 10294(polya 翻转与旋转)
    hdu 4633 Who's Aunt Zhang(polya+逆元)
    Use of Function Arctan
    codeforces 299E Cube Problem
    UVa11806 Cheerleaders(容斥原理)
    UVa11538 A Chess Queen
    UVa11401
    周报(2017.3.19-3.16)
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2117978.html
Copyright © 2011-2022 走看看