算法实现——独立任务最优调度问题(C实现)

      问题描述:用两台处理机A、B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各个作业的特点和机器性能的关系,很可能对于某些i,有a_{i}\geq b_{i},而对于某些 j ,j\neq i,有a_{i}< b_{i}。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得2台机器处理完这n个作业的最短时间(从任意一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a_{1},a_{2},a_{3},a_{4},a_{5},a_{6})=(2,5,7,10,5,2),(b_{1},b_{2},b_{3},b_{4},b_{5},b_{6})=(3,8,4,11,3,4)

       算法分析:对于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文件进行检验

检验完毕~

当然还有多种方法,本文章只使用了其中的一种,相信小伙伴们可以探索出更简单、更合理的程序的~

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值