HNOI 产品加工

给定你两台机器, 有$\large n $ 个物品需要你加工, 每个物品有三个时间 ,分别是在A,B机器上的用时以及A,B机器上共同的用时。

第一次遇见将答案带入DP状态的 的题目

HNOI  产品加工 - 图1 表示处理了前$\large i $ 个物品 A机器用时为$\large j $时 B 机器最短的用时

答案为

HNOI  产品加工 - 图2)%0A#card=math&code=%5Chuge%20min%28max%28f%5Bn%5D%5Bi%5D%2Ci%29%29%0A)

我们考虑如何转移

HNOI  产品加工 - 图3%0A#card=math&code=%5CLarge%20f%5Bi%5D%5B%5Bj%5D%3Dmin%28f%5Bi%5D%5Bj%5D%2Bt_2%2Cf%5Bi-1%5D%5Bj-t_1%5D%2Cf%5Bi-1%5D%5Bj-z%5D%2Bz%29%0A)

分别代表扔给B机器 A机器自己搞 两台机器一起搞

无耻啊 这道题要卡常!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=6e3+5;
  4. int n,t1[N],t2[N],t3[N],dp[2][N*5],w,ans=2e9;
  5. int main()
  6. {
  7. scanf("%d",&n);
  8. for(int i=1;i<=n;i++)
  9. {
  10. scanf("%d%d%d",&t1[i],&t2[i],&t3[i]);
  11. w+=max(t1[i],max(t2[i],t3[i]));
  12. }
  13. for(int i=1;i<=n;i++)
  14. {
  15. memset(dp[i%2],0x7f,sizeof(dp[i%2]));
  16. int inf=dp[i%2][0];
  17. // w+=max(t1[i],max(t2[i],t3[i]));
  18. for(int j=w;j>=0&&dp[(i%2)^1][j]!=inf;j--)
  19. {
  20. if(j-t1[i]>=0&&t1[i]!=0)dp[i%2][j]=min(dp[i%2][j],dp[(i%2)^1][j-t1[i]]);
  21. if(t2[i]!=0)dp[i%2][j]=min(dp[i%2][j],dp[(i%2)^1][j]+t2[i]);
  22. if(j-t3[i]>=0&&t3[i]!=0)dp[i%2][j]=min(dp[i%2][j],dp[(i%2)^1][j-t3[i]]+t3[i]);
  23. }
  24. }
  25. for(int i=0;i<=w;i++)ans=min(ans,max(dp[n&1][i],i));
  26. printf("%d",ans);
  27. return 0;
  28. }