用贪心算法求解多级调度问题之简单代码实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38151011/article/details/84501495

题目为:

   假定有7个独立作业,所需处理时间分别为{2,14,4,16,6,5,3},由三台机器M1,M2,M3加工。按照贪心算法产生的作业调度,求处理机所需要的最短作业时间?

  思路:本题目可以分为两种情况进行考虑:

   (1)机器数大于作业数:即用作业数数量的机器同时进行工作,而作业时间最长的那个即为处理机所需要的最短作业时间。

   (2)机器数小于作业数:用for循环总是找出空闲的机器,然后将机器上的作业时间进行累加,最后累加的时间最长的即为所求处理机所需最短作业时间。

C语言代码实现如下:

//free[100] ={0} 代表处理机空闲的台数 
#include <stdio.h>
int main()
{
    int t,n,m,tim[10000];
    printf("请输入需要执行的数据组数:\n");
    scanf("%d",&t);
    while(t--)
    {
        int i,j,free[100]={0},max,k,t,min,p;
        printf("请输入作业数和机器数:\n");
        scanf("%d%d",&n,&m);
        printf("请输入作业执行时间的相关数据:\n");
        for(i=0;i<n;i++)
            scanf("%d",&tim[i]);
        for(i=0;i<n;i++) //对时间进行从大到小的排序(我用的冒泡排序) 
        {
            for(j=i+1;j<n;j++)
            {
               if(tim[i]<tim[j])
			   {
			   	  t=tim[i];
			   	  tim[i]=tim[j];
			   	  tim[j]=t;
			   }	
			}
			p=tim[0];//用于记录最大的那个作业的时间 
        }
        /*for(i=0;i<n;i++)
        {
        	printf("%d ",tim[i]);
		}
		printf("\n"); */
        if(n<=m) //当机器数目大于作业数时,直接输出最大时间,极为所需最少时间
        {
            printf("所需最少时间为:%d\n",p);
            continue;
        }
        else //机器数目小于作业数时 
        {
            for(i=0;i<n;i++) //思路:总是把任务交给当前最空闲的机器
            {
                min=free[0];
                for(k=0,j=1;j<m;j++)
                    if(free[j]<min)
                    {
                        min=free[j];
                        k=j;
                    }
                free[k]+=tim[i];
               // printf("%d ",free[k]);
            }            
        }
        max=free[0];
        for(i=1;i<m;i++)
            if(free[i]>max)
                max=free[i];
        printf("所需最少时间为:%d\n",max);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38151011/article/details/84501495