感谢晶星童鞋的讨论
啥也不说,上题目:
用两台处理机A和B处理个作业。设第i个作业交给机器A处理时所需要的时间是ai,若由机器B来处理,则所需要的时间是bi。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。
我一开始以为只有第一个作业完成后,才能进行第二个作业呢,后来才意识到是并行。
啥也不说,上代码,C++描述。
#include<iostream>
#include<string>
using namespace std;
int findMax(int a, int b)
{
if(a > b)
{
return a;
}else
{
return b;
}
}
int findMin(int a, int b)
{
if(a < b)
{
return a;
}else
{
return b;
}
}
int main()
{
int N = 6;
int a[] ={ 2, 5, 7, 10, 5, 2 };
int b[6] = { 3, 8, 4, 11, 3, 4 };
int least[6] = {0};
string result[6] = {""};
for (int i = 0; i < N; i++)
{
least[i] = 99;
}
int aSum = 0, bSum = 0;
for (int i = 0; i < N; i++)
{
aSum += a[i];
bSum += b[i];
}
int timeA[6][1000];
int timeB[6][1000];
int timeMax[6][1000];
char who[6][100];
char tempRlt[100];
for (int i = 0; i <= a[0]; i++)
{
timeA[0][i] = i;
if (i < a[0])
{
timeB[0][i] = b[0];
who[0][i] = 'b';
}
else
{
timeB[0][i] = 0;
who[0][i] = 'a';
}
timeMax[0][i] = findMax(timeA[0][i], timeB[0][i]);
}
if (a[0] <= b[0])
{
least[0] = a[0];
tempRlt[0] = 'a';
}
else
{
least[0] = b[0];
tempRlt[0] = 'b';
}
result[0] = string(tempRlt);
for (int k = 1; k < N; k++)
{
int tempSum = 0;
for (int temp = 0; temp <= k; temp++)
{
tempSum += a[temp];
}
for (int i = 0; i <= tempSum; i++)
{
timeA[k][i] = i;
if (i < a[k])
{
timeB[k][i] = timeB[k - 1][i] + b[k];
who[k][i] = 'b';
}
else
{
if ((timeB[k - 1][i] + b[k]) <= timeB[k - 1][i - a[k]])
{
timeB[k][i] = timeB[k - 1][i] + b[k];
who[k][i] = 'b';
}
else
{
timeB[k][i] = timeB[k - 1][i - a[k]];
who[k][i] = 'a';
}
}
timeMax[k][i] = findMax(timeA[k][i], timeB[k][i]);
}
for (int i = tempSum + 1; i < aSum; i++)
{
timeA[k][i] = tempSum;
timeB[k][i] = 0;
}
int flag = 0;
for (int i = 0; i <= tempSum; i++)
{
if (timeMax[k][i] > 0 && timeMax[k][i] < least[k])
{
least[k] = timeMax[k][i];
flag = i;
}
}
tempRlt[k] = who[k][flag];
for (int i = k; i > 0 && flag > 0; i--)
{
if (tempRlt[i] == 'a')
{
flag -= a[i];
tempRlt[i - 1] = who[i - 1][flag];
}
if (tempRlt[i] == 'b')
{
tempRlt[i - 1] = who[i - 1][flag];
}
}
result[k] = string(tempRlt);
}
cout << "完成" << N <<"任务顺序为:" << result[N-1] << " 时间为" <<least[N-1] << endl;
}