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_1t1t2t_2t2000 表示任务不能在该台机器上加工,如果 t3t_3t3000 表示任务不能同时由两台机器加工。

输出格式

仅一行一个整数,表示完成所有 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^31n6×1030≤t1,t2,t3≤50\le t_1,t_2,t_3\le 50t1,t2,t35

思路

背包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;
}
posted @ 2025-11-17 21:22  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源