P2224 [HNOI2001] 产品加工题解
P2224 [HNOI2001] 产品加工
题目描述
某加工厂有 A、B 两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。
某一天,加工厂接到 nnn 个产品加工的任务,每个任务的工作量不尽一样。
你的任务就是:已知每个任务在 A 机器上加工所需的时间 t1t_1t1,B 机器上加工所需的时间 t2t_2t2 及由两台机器共同加工所需的时间 t3t_3t3,请你合理安排任务的调度顺序,使完成所有 nnn 个任务的总时间最少。
输入格式
第一行为一个整数 nnn。
接下来 nnn 行,每行三个非负整数 t1,t2,t3t_1,t_2,t_3t1,t2,t3,分别表示第 iii 个任务在 A 机器上加工、B 机器上加工、两台机器共同加工所需要的时间。如果所给的时间 t1t_1t1 或 t2t_2t2 为 000 表示任务不能在该台机器上加工,如果 t3t_3t3 为 000 表示任务不能同时由两台机器加工。
输出格式
仅一行一个整数,表示完成所有 nnn 个任务的最少总时间。
输入输出样例 #1
输入 #1
5
2 1 0
0 5 0
2 4 1
0 0 3
2 1 1
输出 #1
9
说明/提示
对于所有数据,有 1≤n≤6×1031\le n\le 6\times 10^31≤n≤6×103, 0≤t1,t2,t3≤50\le t_1,t_2,t_3\le 50≤t1,t2,t3≤5。
思路
背包DP。
代码见下
#include<bits/stdc++.h>
#define mod 9999973
using namespace std;
int n,t1[6005],t2[6005],t3[6005],f[3][30004],op=1e9+7;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>t1[i]>>t2[i]>>t3[i];
}
memset(f,31,sizeof(f));
f[0][0]=0;
for(int i=0;i<=n-1;i++){
for(int j=0;j<=i*5;j++){
if(t1[i+1]!=0){
f[(i+1)%3][j+t1[(i+1)]]=min(f[(i+1)%3][j+t1[(i+1)]],f[i%3][j]);
}
if(t2[i+1]!=0){
f[(i+1)%3][j]=min(f[(i+1)%3][j],f[i%3][j]+t2[(i+1)]);
}
if(t3[i+1]!=0){
f[(i+1)%3][j+t3[(i+1)]]=min(f[(i+1)%3][j+t3[(i+1)]],f[i%3][j]+t3[(i+1)]);
}
}
for(int j=0;j<=i*5;j++){
f[(i)%3][j]=1e9+7;
}
}
for(int i=0;i<=5*n;i++){
op=min(op,max(i,f[n%3][i]));
//cout<<i<<" "<<f[n%3][i]<<endl;
}
cout<<op<<endl;
return 0;
}

浙公网安备 33010602011771号