独立任务最优调度问题
给定a[1~n] b[1~n]表示对于完成事件 k ,a完成需要耗时a[k] , b需要b[k], 且不能同时工作,对于给定的2 台处理机A 和B 处理n 个作业,找出一个最优调度方案,使2 台机器处理完这n 个作业的时间最短。
/*
1.状态表示:
1.1集合:p[i][j] 表示1~j个任务下 a消耗时间为 i , b消耗时间为 p[i][j] 的集合
1.2属性:min
2. 状态计算:p[i][j] 可以分为两个状态:第j个事件由a完成 or b完成
2.1 由a完成: p[i - a[j]][j - 1] 前提条件: i > a[j]
2.2 有b完成: p[i][j-1] + b[j] 设为初始选择的状态
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 100 ;
#define INF 0x3f3f3f3f
int n , a[N] ,b[N];
int p[N][N] = {0}; //初始化
int main()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
int ans = INF;
int sum = 0;//a累积消耗时间
for(int j = 1;j <= n; j++) //枚举事件
{
sum += a[j];
for(int i = 0;i <= sum ; i ++) // 枚举 a 可能花费的时间
{
p[i][j] = p[i][j-1] + b[j] ;
if( i >= a[j])
p[i][j] = min(p[i][j],p[i - a[j]][j - 1]);
}
}
for(int i=0;i<=sum;i++)//枚举a最终所耗费的时间 找到最小消耗
{
int t = max(p[i][n] , i);
if(ans > t) ans = t;
}
cout<<ans<<endl;
return 0;
}