问题描述:用两台处理机A、B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各个作业的特点和机器性能的关系,很可能对于某些i,有,而对于某些 j ,,有。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得2台机器处理完这n个作业的最短时间(从任意一台机器开工到最后一台机器停工的总时间)。研究一个实例:,。
算法分析:对于2台给定的处理机A和B处理个作业,找出一个最优调度方案,使2台机器处理外这n个作业的时间最短。
输入数据:由文件input.txt提供输入数据。文件的第一行是1个正整数n,表示要处理的n个作业。在接下来的两行中,每行有n个正整数,分别代表处理机A和B处理第i个作业需要的处理时间。
结果输出:将计算出的最短处理时间输出到文件output.txt。
#include<stdio.h>
#define MAXTIME 500
int a[MAXTIME];
int b[MAXTIME];
int minTime=10000;
int sa=0;//所有作业在机器A上运行是所需要的时间
int main(){
int n;//n个作业
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n); //读入作业个数
for(int i=1;i<n+1;i++)//读入机器A运行时间
scanf("%d",&a[i]);
for(int i=1;i<n+1;i++)//读入机器B运行时间
scanf("%d",&b[i]);
int p[MAXTIME][n+1]={0};
for(int k=1;k<=n;k++) //代表作业
{
sa+=a[k]; //假设都在A上运行,得出时间和sa
for(int i=0;i<=sa;i++)
{
p[i][k]=p[i][k-1]+b[k];
if(i>=a[k]){ //当前时间是否满足其在机器a上运行
p[i][k]=p[i][k]<p[i-a[k]][k-1]?p[i][k]:p[i-a[k]][k-1];
}
}
}
for(int i=0;i<=sa;i++){ //遍历p数组,p[i][n]的值是n个作
int t=(p[i][n]>i?p[i][n]:i);//业在B上运行时间,i意思是n个作业在A上运行时间
if(minTime>t)
minTime=t;
}
printf("%d\n",minTime);
return 0;
}
那么现在来检验一下吧~
(1)在代码相同路径下建立题目所需要的文件
(2)在input.txt文件中输入所需要检验的例题
(3)运行代码
(4)打开output.txt文件进行检验
检验完毕~
当然还有多种方法,本文章只使用了其中的一种,相信小伙伴们可以探索出更简单、更合理的程序的~