双机工作,独立条件最优解

来源:互联网 发布:淘宝排名软件 编辑:程序博客网 时间:2024/05/21 07:59

0010:双机工作问题(难度2,动态规划或剪枝搜索)
   

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
10000ms 
单个测试点时间限制: 
1000ms 
内存限制: 
10000kB
描述

用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。每件作业在a,b机上处理时间不同,两台机可同时工作,作业处理顺序严格按照作业序号进行(例:如果2号任务尚未开始加工,3号任务也不能进行加工),欲求加工n个任务所需最小时间。

输入
文件的第1行是1个正整数n, 表示要处理n个作业。接下来的2行中,每行有n个正整数,分别表示处理机A和B处理第i个作业需要的处理时间。
输出
最短完成作业时间
样例输入
6                2 5 7 10 5 23 8 4 11 3 4
样例输出

15



独立任务最优解法  重下向上
设完成K个任务A需要的时间为x;
如果知道k-1任务的最优时间,就能确定k任务 是由A 来完成 还是B 来完成


当前任务由A完成: F[x+A[k]][k]=F[x][k-1];
当前任务由B完成: ①F[x][k]=F[x][k-1]+B[k];
变化 A式得:     ②F[x][k]=F[x-A[k]][k-1];


列子:当N=2时 A={2,5} ,B={3,8} 其最优时间 明显是5,所以难点是分配任务;
做一个任务,只能是A或B必须花费任务所需的时间。
1.一个任务,当 0<y<A[1] 时   因为 y没到A[1] 所以说明A没做完,即
在F[0<=y<A[1]][k]的值就为B[1]; 
2.多个任务,(x是A总时间) 当(0<y<A[k])时因为A没做完,B[y][k]还得自己完成当前任务;
当y==A[k]时就要判断当前是由A或B完成 去MIN(①,②)
当A[k]<y<=x 时 只要y=任意A任务相加就表明A完成了多少任务,就要做MIN(①,②)
表明剩下任务由B做好还是A做好;



#include "iostream"#include "string.h"using namespace std;#define Max  20#define Sky  9999999#define MAX(a,b) ( a > b ? a : b )#define MIN(a,b) (a<b?a:b)int N;int A[Max],B[Max];int F[Max][Max];int main(){       freopen("1.txt","r",stdin);cin>>N;int i,x; for(i=1;i<=N;i++){cin>>A[i];}for(i=1;i<=N;i++){cin>>B[i];}    memset(F,0,sizeof(F));int SumA=0;for(int k=1;k<=N;k++){SumA+=A[k];     //记录A的时间for(x=0;x<=SumA;x++)    {F[x][k]=F[x][k-1]+B[k];  //当前任务由B完成 可看上面公式if(x>=A[k])   //如果B完成任务的时间大于当前A[k]时,就要取最优B时间{  F[x][k]=MIN(F[x][k],F[x-A[k]][k-1]);}}}        int End=Sky;for(i=1;i<=SumA;i++){   End=MIN(End,MAX(i,F[i][N]));//取所有最大完成时间中最小的}      cout<<End<<endl;return 0;}

省内存的代码:

#include "iostream"#include "string.h"using namespace std;#define Max  5000000#define Sky  9999999#define MAX(a,b) ( a > b ? a : b )#define MIN(a,b) (a<b?a:b)int N;int  A[Max] ,B[Max] ;int F[Max] ;int main(){    //freopen("1.txt","r",stdin);cin>>N; int Sum=0;int i,x; for(i=1;i<=N;i++){cin>>A[i];Sum+=A[i];} for(i=1;i<=N;i++){cin>>B[i];F[i]=0;}int SumA=0;for(int k=1;k<=N;k++){           SumA+=A[k];for(x=SumA;x>=0;x--){     F[x]=F[x]+B[k]; if(x>=A[k]) { F[x]=MIN(F[x],F[x-A[k]]); }}}    int End=Sky;for(i=1;i<=Sum;i++){End=MIN(End,MAX(i,F[i]));}    cout<<End<<endl;return 0;}


1 0
原创粉丝点击