思路:
A机器第i个作业需要的处理时间记为a[i];
B机器第i个作业需要的处理时间记为b[i];
F[i][j]表示完成i个作业机器A花费j时间的条件下机器B所费时间的最小值
假设前i-1个作业已经被处理了,第i件作业有两种处理方式:
- 机器A处理:则B时间为F[i-1][j-a[i]];即B为处理上一个作业的时间
- 机器B处理:则B时间为F[i-1][j]+b[i];
其中有特殊情况:如果j<a[i],则不可能由A完成,只能由B完成,即为B处理情况
得出:F[i][j]=min{F[i-1][j]+b[i],F[i-1][j-a[i]]}
算法思路:
确立B最小时间时,取其中最小值;
计算作业完成时间时,取最大值(因为A,B都完工才算处理完成作业);
再从这些最大值中比较选出最小值
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;;
int a[201],b[201];
int f[201][10001];
int sum=0;
int main()
{
ifstream fin("sched10.in",ios::in);
ofstream fout("answer10.txt");
int n;
fin>>n;
int minx=99999;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++)
{
fin>>a[i];
// cout<<a[i]<<endl;
}
for(int i=1;i<=n;i++)
{
fin>>b[i];
// cout<<b[i]<<endl;
}
for(int i=1;i<=n;i++)
{
sum+=a[i];
for(int j=0; j<=sum; j++)
{
f[i][j]=f[i-1][j]+b[i];
if(j>=a[i])
f[i][j]=min(f[i-1][j]+b[i],f[i-1][j-a[i]]);
}
}
for(int i=0;i<=sum;i++)
minx=min(minx,max(f[n][i],i));
fout<<minx;
cout<<minx;
fout.close();
fin.close();
return 0;
}