独立任务最优调度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HLK_1135/article/details/78949409

【问题描述】
用两台处理机A和B处理n个作业。设第i个作业交给A处理需要时间ai,交给B处理需要时间bi。由于各作业的特点和机器的性能关系,ai和bi之间没有明确的大小关系。既不有将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短。
【测试用例】
6(任务数目)
2 5 7 10 5 2(机器A处理这些任务的时间)
3 8 4 11 3 4(机器B处理这些任务的时间)
【输出】
15

方法一:(0-1暴力)

6
2 5 7 10 5 2
3 8 4 11 3 4
任务分配给两个机器,两个机器上找时间最大的,最后找最小的

#include<stdio.h>
#include<math.h>
#define N 100
int main()
{
    int i,j,n;
    int temp=0,time=1000000;
    int a[N]={0},b[N]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
        scanf("%d",&b[i]); 
    for(i=0;i<=pow(2,n);i++) {
        int sum1=0,sum2=0,k=0;
        int num=i;
        for(j=0;j<n;j++) {
            if(num%2)
                sum1+=a[k];
            else
                sum2+=b[k];
            k++;
            num/=2;
        }
        temp=sum1>sum2?sum1:sum2;
        if(temp<time) {
            time=temp;
        }       
    }
    printf("%d\n",time);
    return 0;
}

方法二:(动态规划)

代码:

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来处理
F[k-1][x-a[k]]表示第k个作业由机器A处理

#include<stdio.h>
#define N 100
int main()
{
    int i,j,n;
    int sum=0;
    int a[N]={0},b[N]={0},t[N][N]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    for(j=0;j<n;j++) {
        scanf("%d",&b[j]);
    }
    for(i=1;i<=n;i++) {
        for(j=0;j<=sum;j++) {
            if(j<a[i-1]) //在这个时间段交给b处理 
                t[i][j]=t[i-1][j]+b[i-1];
            else if(t[i-1][j-a[i-1]]>t[i-1][j]+b[i-1])
                t[i][j]=t[i-1][j]+b[i-1];
            else
                t[i][j]=t[i-1][j-a[i-1]];
        }
    }
    int min=1000000;
    for(i=0;i<=sum;i++) {
        j=t[n][i]>i?t[n][i]:i;
        if(min>j) {
            min=j;
        }
    }
    printf("%d\n",min);
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/HLK_1135/article/details/78949409