zoukankan      html  css  js  c++  java
  • 达到最高效益的调度

    View Code
    #include<IOSTREAM.H>
    #include <IOMANIP.H>
    #include <STRING.H>
    #include <STDLIB.H>
    #include <stdio.h>
    /************************************************************************/
    /* 问题: 假设有一台机器,以及在此机器上处理的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之前的作业能够在更充裕的时间内被调度。                                                                 
    */
    /************************************************************************/
    int min(int a,int b)
    {
        return a<b?a:b;
    }
    void main()
    {
        int N=5;
        int d[7]={0,2,3,4,5,7,8};
        int T[7]={0,2,1,2,1,3,5};
        int V[7]={0,4,2,3,3,3,14};
        
        int array[7][9];
        for (int i=0;i<7;i++)
        {
            array[i][0]=0;
        }
        for(int j=0;j<9;j++)
            array[0][j]=0;
        for (i=1;i<7;i++)
        {
            for (j=1;j<=d[i];j++)
            {
                int temp1=array[i-1][min(j,d[i-1])];
                int temp2=0;
                if(j-T[i]>=0)    temp2=array[i-1][min(j-T[i],d[i-1])]+V[i];
                array[i][j]=temp1>=temp2?temp1:temp2;
            }
        }
        
        cout<<array[6][8]<<endl;
    }
  • 相关阅读:
    11 2
    10 29
    10 22
    dp的本质
    笛卡尔树小结
    Gitlab 备份迁移恢复报错gtar: .: Cannot mkdir: No such file or directory
    升级Jenkins版本
    当linux中的所有指令突然不能使用的时候
    合并范围
    每股收益列报计算
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2752208.html
Copyright © 2011-2022 走看看