【算法设计与分析】C++独立任务最优调度问题

这篇具有很好参考价值的文章主要介绍了【算法设计与分析】C++独立任务最优调度问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题描述:

  用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。

实例:

(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);

(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。

对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。

输入:

6
2 5 7 10 5 2
3 8 4 11 3 4

 输出:

15

二、思路分析

题目要求使用动态规划的算法,先给出状态转移方程:

【算法设计与分析】C++独立任务最优调度问题

其中表示到第i个作业,A机器花费时间为j的情况下,B机器处理的最短时间

我们分为两种情况:

1、A处理机完成了第i个任务,那么B处理机完成k个任务的最短时间就与B处理机完成i-1个任务所需的最短时间是相同的,即

2、B处理机完成了第i个任务,那么B处理机完成i个任务的最短时间就等于B处理机完成i-1个任务的最短时间加上B处理机完成第i个任务所需要的时间,即【算法设计与分析】C++独立任务最优调度问题

我们完成作业的最短时间是由A机器完成时间和B机器完成时间中较大的那一者来决定,因为一项作业的真正完工需要两个都完成才算完成。 所以在最终计算完成时间时,我们要取A、B完成时间的最大值,再根据每个不同j的取值(即分配给A机器花费时间j的不同情况下)循环遍历查找最小的那个,代码中为x代替j。文章来源地址https://www.toymoban.com/news/detail-513465.html

三、代码

#include <bits/stdc++.h>
#define MAXN 1005
using namespace std;
int a[MAXN];//机器A处理各作业的时间
int b[MAXN];//机器B处理各作业的时间
int F[MAXN][MAXN];
int time_[MAXN];//处理作业k所需要的最短时间
int n;

int dp() {
    int sumA = a[1];
    //k = 1的情况
    for(int x = 0; x < a[1]; x++) { //分配给A的时间小于A处理第一个作业所需时间,给B
        F[1][x] = b[1];
    }
    F[1][a[1]] = min(b[1],a[1]);//正好够A就看谁小
    //初始化
    for(int i = 2; i <= n; i++) {
        for(int j = 0; j <= n; j++) {
            F[i][j] = INT_MAX;
        }
    }
	//k >= 2的情况
    for(int k = 2; k <= n; k++) {
        sumA += a[k];
        time_[k] = INT_MAX;
        for(int x = 0; x <= sumA; x++) {
            if(x < a[k]) {
                F[k][x] = F[k-1][x] + b[k];
            } else {
                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]));
            //max(x,F[k][x])表示前k个作业机器A花费x分钟,B机器花费F[k][x]分钟情况下,最迟完工时间
        }
    }
    return time_[n];
}

int main() {
    printf("请输入作业数量:");
    scanf("%d",&n);
    printf("请输入机器A处理每个作业的时间:");
    for(int i = 1; i <= n; i++) {
        scanf("%d",&a[i]);
    }
    printf("请输入机器B处理每个作业的时间:");
    for(int i = 1; i <= n; i++) {
        scanf("%d",&b[i]);
    }
    printf("总的最少处理时间为:%d\n",dp());
    return 0;
}

到了这里,关于【算法设计与分析】C++独立任务最优调度问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统

    使用了标准库头文件 setjmp.h 中的 setjmp 和 longjmp 两个函数,构建了一个简单的查询式协作多任务系统,支持 独立栈 和 共享栈 两种任务。 其中涉及到获取和设置栈的地址操作,因此还需要根据不同平台提供获取和设置栈的地址操作(一般是汇编语言,因为涉及到寄存器) 该

    2024年02月19日
    浏览(38)
  • 算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

    (一)题目 问题描述 给定一个由 n n n 行数字组成的数字三角形,如图所示。 试设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 算法设计 对于给定的由 n n n 行数字组成的数字三角形,计算从该三角形的顶至底的路径经过的数字和的最大值

    2023年04月10日
    浏览(30)
  • 【华为OD机试真题】1084 - 最优高铁城市修建方案(JAVA C++ Python JS) | 机试题+算法思路+考点+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用 Java语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述

    2024年02月05日
    浏览(35)
  • 分布式任务调度系统分析

    首先,我们来思考一些几个业务场景: XX 信用卡中心,每月 28 日凌晨 1:00 到 3:00 需要完成全网用户当月的费用清单的生成 XX 电商平台,需要每天上午 9:00 开始向会员推送送优惠券使用提醒 XX 公司,需要定时执行 Python 脚本,清理掉某文件服务系统中无效的 tmp 文件 最开始,

    2023年04月22日
    浏览(52)
  • C++语言Qt实现 实时任务调度仿真软件 任务参数可配置和随机生成支持多核调度

    我遇到个需求: 目标: 开发一个实时任务调度仿真软件,我们在学习操作系统这门课时候,经常需要观察任务动态调度情况,来更好的直观学习操作系统任务调度过程和调度算法。 内部原理: 操作系统任务调度实际上是一个有限状态机,任务的各种状态不断的转换过程,我

    2023年04月25日
    浏览(26)
  • 算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++)

    (一)题目 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有着不同颜色的最小着色数,相当于

    2024年02月07日
    浏览(65)
  • 云计算中的任务调度算法

    一、云计算 1、云计算可以说是并行计算与分布式计算相结合的产物,利用互联网和虚拟机技术使得各种资源能够提供给用户使用。按需服务、弹性可扩展是其主要特征。  一次正常的用户服务流程为: 用户提交任务到云端, 任务调度器将任务分配到合适的计算资源上执行, 

    2024年02月03日
    浏览(32)
  • 利用优化算法提高爬虫任务调度效率

    在大规模数据采集的场景中,高效的任务调度是关键之一。通过利用优化算法,我们可以提高爬虫任务的调度效率,加快数据采集速度,并有效利用资源。本文将为您介绍如何利用优化算法来优化爬虫任务调度,实现高效的批量采集。 一、任务调度优化的重要性 在批量采集

    2024年02月09日
    浏览(32)
  • 如何设计一个海量任务调度系统

    在日常开发中会经常遇到一些需要异步定时执行的业务诉求,典型的使用场景如:超时未支付订单关单、每隔 2h 更新好友排行榜、3.22 日 17 点《xx》剧上线等。目前业务侧多基于以下思路来快速搭建一个调度系统,mysql 或者 redis 队列存储待执行任务,通过 crontab 定时触发应用

    2024年02月09日
    浏览(28)
  • 系统设计面试指南之分布式任务调度

    任务是需要资源(CPU 时间、内存、存储、网络带宽等)在指定时间内完成的一段计算工作。 通过智能地将资源分配给任务以满足任务级和系统级目标的系统称为任务调度程序。 任务调度程序: 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发表评论时。我

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包