题目大意:有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。不同的机器加工同一产品所需的时间不同,若同时由两台机器共同进行加工,所完成任务又会不同。选择每个产品的加工方式,最小化所需时间
题解:这个状态……
f[i]表示第一台机器工作时间为i时,第二台机器的最少工作时间
似乎没接触过这种把两个量绑在一起的状态……长姿势了
注意到时间<=5,类似背包的转移即可,有三种决策
我的收获:dp强啊
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
#define M 6000*5+5
int n,m,f[M],a[M],b[M],c[M];
struct use{
int a,b,c;
void read(){scanf("%d%d%d",&a,&b,&c);if(!a)a=M;if(!b)b=M;if(!c)c=M;}
int Min(){return min(min(a,b),c);}
}p[M];
void DP()
{
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--){//01背包逆序……
int temp=M;
if(j-p[i].a>=0) temp=min(temp,f[j-p[i].a]);
temp=min(temp,f[j]+p[i].b);
if(j-p[i].c>=0) temp=min(temp,f[j-p[i].c]+p[i].c);
f[j]=temp;
}
}
void work()
{
DP();
int ans=M;
for(int i=0;i<=m;i++) ans=min(ans,max(i,f[i]));
printf("%d",ans);
}
void init()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) p[i].read(),m+=p[i].Min();
}
int main()
{
init();
work();
return 0;
}