使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。

 

可以考虑以下的贪心策略:

 

1)最长处理时间作业优先的贪心选择策略。

 

2)最短处理时间作业优先的贪心选择策略。

 

3)作业到达时间优先的贪心选择策略。

package test;

import java.util.*;
public class TxDjdu{
static int N=7; //作业数
static int M=3; //机器数 
static int[] s=new int[M];//每台机器当前已分配的作业总耗时 

public static void main(String arg[]) 
{
    
    int[] time =new int[]{2,14,4,6,16,5,3};
    Sort(time,N);//处理时间按从大到小排序 
    int maxtime = 0;
    if(M >= N)
    {
         maxtime = work1(time,N);
    }
    else
    {
         maxtime = work2(time,N); 
    } 
    
    System.out.print("最长作业优先算法耗费时间:"+maxtime);
}

//冒泡排序
static void Sort(int t[],int n){
    int temp;
    for(int i=1;i<n;i++){
        for(int j=0;j<n-i;j++){
            if(t[j]<t[j+1]){
                temp=t[j];
                t[j]=t[j+1];
                t[j+1]=temp;
            }
        }
    }
}

//机器数大于待分配作业数
static int work1(int t[],int n)
{
  int i;
  for(i=0;i<n;i++)
  {
     s[i] = t[i];
  }
  int ma = maxWork(s,N);//s中最长的机器工作时间为结果
  return ma;
}

//机器数小于待分配作业数 
static int work2(int t[],int n)
{
    int i;
    int mi = 0;
    for(i=0;i<n;i++)
    {
      mi = min(M);//找到空闲的机器号
      System.out.printf("%d,时间和最小的机器号为%d.时间和为%d:\n",i,mi,s[mi]);
      s[mi] = s[mi]+t[i];//每次取最长的作业放入机器中
    
    }
    int ma = maxWork(s,M);//s中最长的机器工作时间为结果
    return ma;
}

//求出目前处理作业的时间和 最小的机器号
static int min(int m)
{
    int min = 0;
    int i;
    for(i=1;i<m;i++)
    {
        if(s[min] > s[i])
        {
           min = i;
        }
    }
    return min;
    
}
//求最终结果(最长处理时间)
static int maxWork(int s[],int num)
{
    int max = s[0];
    int i;
    for(i=1;i<num;i++)
    {
        max=Math.max(max, s[i]);
    }
    
    return max;

} 
}