设有n个独立的作业{1,2,…,n},由m台相同的机器进行加工处理。作业i所需的处理时间为ti。现约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。
现要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
NP难问题。
想法:尽可能的使每个机器的工作时间趋向一致,所以用最长时间的作业去填当前工作时间最短的机器(即最长处理时间作业优先)。
可以用贪心策略取得近似解。
当n<=m,直接分配给n个机器。
当n>m,将作业按作业时间大到小排序,然后按此顺序安排给空闲的机器
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int cmp(const void* a, const void* b)
{
return *(int*)b - *(int*)a;
}
int main()
{
int t,n,m;
scanf("%d", &t);
for( int i = 1; i <= t; i++ )
{
scanf("%d%d",&n,&m);
int operition[n], machine[m];
for( int j = 0; j < m; j++ )
machine[j] = 0;
for( int j = 0; j < n; j++ )
{
scanf("%d", &operition[j]);
}
qsort(operition,n, sizeof(operition[0]), cmp);
int j = 0;
int m_index = 0;
while(j < n)
{
machine[m_index] += operition[j++]; //将作业分给空闲的机器
for( int k = 0; k < m; k++ ) //找出总工作时间最短的机器,即下一个空闲的机器
if( machine[m_index] > machine[k])
m_index = k;
}
int mtime = machine[0];
for( int k = 0; k < m; k++ )
if( mtime < machine[k])
mtime = machine[k];
printf("Case %d: %d\n",i,mtime);
}
return 0;
}