独立任务最优调度(动态规划)
题目:
用两台处理机
算法思路:
当完成
根据
考虑以下包含
作业1 | 作业2 | 作业3 | 作业4 | 作业5 | 作业6 | |
处理机A | 2 | 5 | 7 | 10 | 5 | 2 |
处理机B | 3 | 8 | 4 | 11 | 3 | 4 |
(2)对于第二个作业,
(3)下面是详细步骤:
依次类推
下面是代码的实现:
#include<iostream>
using namespace std;
void Read(int *a,int *b,int n)///输入对应的时间值
{
cout<<"请输入机器A处理每个作业的时间:";
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cout<<endl<<"请输入机器B处理每个作业的时间:";
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
}
int min(int x, int y)
{
return x < y ? x : y;
}
int max(int x, int y)
{
return x > y ? x : y;
}
int dyna(int *a,int *b,int **F,int n,int *time)
{
int sumA=a[1];///一开始的时间
///当k=1的时候
for(int x=0;x<a[1];x++)///时间<a[1]时说明是b完成的
{
F[1][x]=b[1];///这里要注意
}
F[1][a[1]]=min(a[1],b[1]);///第一个要选择最小值来完成第一个工作
///此时需要进行初始化
for(int i=2;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
F[i][j]=100000000;
}
}
///当k=2时,
for(int k=2;k<=n;k++)
{
sumA+=a[k];///时间的累加
time[k]=100000000;
for(int x=0;x<=sumA;x++)///注意是x
{
if(x<a[k])///说明第k个是b完成的,k-1是a完成的
{
F[k][x]=F[k-1][x]+b[k];
}
else///说明第k-1个是b完成的,第k个是a完成的
{
F[k][x]=min(F[k-1][x]+b[k],F[k-1][x-a[k]]);
}
time[k]=min(time[k],max(x,F[k][x]));
}
}
return time[n];
}
int main()
{
int n;
cin>>n;
int *a=new int[n];
int *b=new int[n];
int **F=new int *[n];
int *time=new int[n];
for(int i=1;i<=n;i++)
{
F[i]=new int[n*n];
}
Read(a,b,n);
cout<<endl<<"输出独立任务最优调度的时间值为:"<<dyna(a,b,F,n,time);
return 0;
}
下面是运行结果如下:
上一篇: 一文读懂 Java Calendar类
下一篇: Java:栈的几种不同实现