1209: 独立任务最优调度问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 3  解决: 2
[提交][状态][讨论版][命题人:liyuansong]

题目描述

用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个作业的时间最短。

输入

第1行是1个正整数n,表示要处理n个作业。在接下来的2行中,每行有n个正整数,分别表示处理机A和B处理第i个作业需要的处理时间。

输出

程序运行结束时,将计算出的最短处理时间输出。

样例输入

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

样例输出

  1. 15
  2.  
  3. 分析:
      1、我们可以先确定一个基础的处理机(即就是所有作业都用这个处理机处理)
      2、遍历所有的作业
      3、遍历第一步得到的基础时间,得出对应时间的作业最优处理机制
        状态方程:dp[j] = min(dp[j-A[i]], dp[j] + B[i]);
        说明:dp[j-A[i]] ==> 表示在j时间段之内执行使用A处理机处理i问题
           dp[j] + B[i] ==> 表示第i个问题由B处理机来处理
      4、最后再遍历时间线上的值,找出耗时最短的走法
  4. 核心代码:
      
  1. for(int i = ; i < n; ++ i)
  2. {
  3. for(int j = my_max; j >= ; -- j)
  4. {
  5. if (j > A[i])
  6. dp[j] = min(dp[j-A[i]], dp[j] + B[i]);
  7. else
  8. dp[j] += A[i];
  9. }
  10. }

C/C++代码实现(AC):

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <stack>
  7. #include <map>
  8. #include <queue>
  9. #include <climits>
  10.  
  11. using namespace std;
  12. const int MAX = 1e6 + ;
  13. const int MY_MAX = 2e2 + ;
  14. int A[MY_MAX], B[MY_MAX], dp[MAX], n, ans = INT_MAX, my_sum = ;
  15.  
  16. int main()
  17. {
  18. scanf("%d", &n);
  19. for (int i = ; i < n; ++ i)
  20. scanf("%d", &A[i]),
  21. my_sum += A[i];
  22. for (int i = ; i < n; ++ i)
  23. scanf("%d", &B[i]);
  24.  
  25. for(int i = ; i < n; ++ i)
  26. {
  27. for (int j = my_sum; j >= ; -- j)
  28. {
  29. if (j > A[i])
  30. dp[j] = min(dp[j-A[i]], dp[j] + B[i]);
  31. else
  32. dp[j] += A[i];
  33. }
  34. }
  35. for (int i = ; i <= my_sum; ++ i)
  36. {
  37. int temp = max(dp[i], i);
  38. ans = min(ans, temp);
  39. }
  40. printf("%d\n", ans);
  41. return ;
  42. }

suseoj 1209: 独立任务最优调度问题(动态规划)的更多相关文章

  1. 动态规划——独立任务最优调度(Independent Task Scheduling)

    题目链接 题目描述 用2 台处理机A 和B 处理n 个作业.设第i 个作业交给机器A 处理时需要时间i a ,若由机器B 来处理,则需要时间i b .由于各作业的特点和机器的性能关系,很可能对于某些i ...

  2. 背包的第k优解[动态规划]

    From easthong ☆背包的第k优解                 描述 Description     DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是 ...

  3. 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱

    题1  素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...

  4. 【动态规划】流水作业调度问题与Johnson法则

    1.问题描述:     n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi ...

  5. dp入门——由分杆问题认识动态规划

    简介 如果你常刷leetcode,会发现许多问题带有Dynamic Programming的标签.事实上带有dp标签的题目有115道,大部分为中等和难题,占所有题目的12.8%(2018年9月),是占 ...

  6. LeetCode 笔记系列 20 Interleaving String [动态规划的抽象]

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...

  7. 独立IP与共享IP的区别

    做网站选择独立IP还是共享IP,相信很多站长都在此纠结过,自己不使用服务器的时候从来没有关心过独立IP和共享IP的究竟有什么具体的差别.但当自己真正用到的时候,才发现:同样都是 IP,差别不是一般的大 ...

  8. [leetcode] 72. 编辑距离(二维动态规划)

    72. 编辑距离 再次验证leetcode的评判机有问题啊!同样的代码,第一次提交超时,第二次提交就通过了! 此题用动态规划解决. 这题一开始还真难到我了,琢磨半天没有思路.于是乎去了网上喵了下题解看 ...

  9. 开始奇妙的DP之旅

    铭记各位大佬教导,开始看一些很迷的动态规划,那就从比较典型的01背包开始吧,想想还是从比较简单的导弹拦截开始吧,说简单都是骗人的,还是看采药吧. 一.动态规划 刚听到动态规划这个东西,据HLT大佬所言 ...

随机推荐

  1. Vue核心之数据劫持

    前瞻 当前前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Anglar,Regular,Vue,React等等,它们最大的优点就是可以实现数据绑定,再也不需要手动进行DOM操作了, ...

  2. vue——前端跨域

    ***针对的是不同域名.不同协议的跨域: 1.找到config文件中开发环境的配置文件——dev.env.js,在里面将要跨域的域名配置进去 2.找到config文件中线上环境的配置文件——prod. ...

  3. Redis中是如何实现分布式锁的?

    分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...

  4. vue实现简单学生信息管理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java类型信息(RTTI和反射)

    要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...

  6. java ThreadLocal线程设置私有变量底层源码分析

    前面也听说了ThreadLocal来实现高并发,以前都是用锁来实现,看了挺多资料的,发现其实还是区别挺大的(感觉严格来说ThreadLocal并不算高并发的解决方案),现在总结一下吧. 高并发中会出现 ...

  7. 如何利用Fiddler4进行Android APP / IOS APP抓包

    Fiddler抓包 1.Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据. F ...

  8. 微信支付 get_brand_wcpay_request fail,Undefined variable: openid

    本文将为您描述微信H5支付,微信JSAPI支付返回支付签名验证失败的解决方法 微信JSAPI支付时报这个错误 查看错误详情 alert(JSON.stringify(res)) 微信商户平台相关设置: ...

  9. $.ajax.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel= ...

  10. fenby C语言 P27使用指针

    使用指针 p代表地址 *p代表这个地址存放的内容 #include <stdio.h> int main(){ int x=100,y=200,*p1=&x,*p2=&y; ...