题意:
已知每个任务在A机器上加工所需的时间t1, B机器上加工所需的时间t2及由两台机器共同加工所需的时间t3,请你合理安排任务的调度顺序,使完成所有n个任务的总时间最少。
题解:
dp好题。
想过网络流,无果。
然后想dp,似乎不可做的样子。
orz状态表示,发现这的挺强:
f[i][j]
表示前i个产品,在A上工作了j的时间,在B上最少工作多久。
这样等于强制降了一维。
然后就很好转移了。
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int f[30005],a[6005],b[6005],c[6005],n,m=0;
const int inf=(1<<28);
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--)
{
int t=inf;
if(j-a[i]>=0)
t=min(t,f[j-a[i]]);
t=min(t,f[j]+b[i]);
if(j-c[i]>=0)
t=min(t,f[j-c[i]]+c[i]);
f[j]=t;
}
int ans=inf;
for(int i=0;i<=m;i++) ans=min(ans,max(i,f[i]));
printf("%d",ans);
}