[bzoj1222]产品加工

用f[i][j]表示完成前i个任务,在A机器上加工j小时时B机器上最少要工作多小时,转移就分为三种,即$f[i][j]=min(f[i-1][j-t1],f[i-1][j]+t2,f[i-t3]+t3)$,然后这个东西可以用类似于背包的方式优化到1维(注意要从大到小枚举)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a,b,c,s,ans,f[30005];
 4 int main(){
 5     scanf("%d",&n);
 6     for(int i=1;i<=n;i++){
 7         scanf("%d%d%d",&a,&b,&c);
 8         if (!a)a=1e5;
 9         if (!b)b=1e5;
10         if (!c)c=1e5;
11         for(int j=5*n;j>=0;j--){
12             f[j]+=b;
13             if (j>=a)f[j]=min(f[j],f[j-a]);
14             if (j>=c)f[j]=min(f[j],f[j-c]+c);
15         }
16     }
17     ans=f[0];
18     for(int i=1;i<=5*n;i++)ans=min(ans,max(i,f[i]));
19     printf("%d",ans);
20 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11844813.html