[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 }