传送门
奇怪的dp
用f[i]表示第一个机器工作了i时第二个机器的最短工作时间。
暴力枚举由哪一个机器完成即可。
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int a[6005],b[6005],c[6005],f[30005],n,m,ans,tmp;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
if (!a[i]) a[i]=inf;
if (!b[i]) b[i]=inf;
if (!c[i]) c[i]=inf;
m+=min(a[i],min(b[i],c[i]));
}
for (int i=1;i<=n;i++)
for (int j=m;j>=0;j--){
tmp=inf;
if (j>=a[i]) tmp=min(tmp,f[j-a[i]]);
tmp=min(tmp,f[j]+b[i]);
if (j>=c[i]) tmp=min(tmp,f[j-c[i]]+c[i]);
f[j]=tmp;
}
ans=inf;
for (int i=0;i<=m;i++) ans=min(ans,max(f[i],i));
printf("%d",ans);
}