Independent Task Scheduling(独立任务最优调度问题)

问题描述:

独立任务最优调度,又称双机调度问题:用两台处理机A和B处理n个作业。
设第i个作业交给机器A处理时所需要的时间是a[i],若由机器B来处理,则所需要的时间是b[i]。
现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。
设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。

数据输入:

n = 6
a[n] = 2 5 7 10 5 2
b[n] = 6 8 4 11 3 4

结果输出:

15

思路:

  • 当完成k个作业,设机器A花费了x时间,机器B所花费时间的最小值肯定是x的一个函数,

  • 设F[k][x]表示机器B所花费时间的最小值,则 F[k][x]=Min{ F[k-1][x]+b[k], F[k-1][x-a[k]]
    }。

  • F[k-1][x]+b[k]表示第k个作业由机器B来处理(完成k-1个作业时机器A花费的时间仍是x,前提就是A机器停机的时间是x)

  • F[k-1][x-a[k]]表示第k个作业由机器A处理(完成k-1个作业时机器A花费的时间是x-a[k])。

  • 我们可知机器A花费时间x与机器B花费时间F[k][x]中的较大值为AB机器完成任务k的最终时间:Max(x, F[k][x])。

  • 当x = 0,1,2……sumA,可得到一串较大值序列,取序列中最小的值即为结果。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,dp[100005];
    int sumA=0,ans=999999999;
    int a[205],b[205];
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sumA+=a[i];
        dp[i]=0;//初始化
    }
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
    }
    for(int k=0;k<n;k++)
    {
        for(int i=sumA;i>=0;i--)
        {
            if(i>=a[k])
            {
                dp[i]=min(dp[i]+b[k],dp[i-a[k]]);
            }
            else dp[i]=dp[i]+b[k];
        }
    }
    for(int i=0;i<=sumA;i++)
    {
        int t=max(i,dp[i]);//取较大的
        ans=min(ans,t);//取较小的
    }
    cout<<ans<<endl;
}
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值