P2224 [HNOI2001]产品加工
这种背包是不是把一维扔进状态就都能做了啊
\(dp_{i,j}\)表示到了第i个任务的时候A机器工作了j时间,转移显然
有点卡时间,注意常数优化
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int p;
int t[6005][4];
int dp[2][300005];
int sum;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d%d",&t[i][0],&t[i][1],&t[i][2]);
sum=sum+max(max(t[i][0],t[i][2]),t[i][1]);
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;++i){
p^=1;
int pre=p^1;
memset(dp[p],0x3f,sizeof(dp[p]));
for(int j=0;j<=sum;++j){
if(t[i][0]!=0)
dp[p][j]=min(dp[pre][j]+t[i][0],dp[p][j]);
if(j>=t[i][2]&&t[i][2]!=0){
dp[p][j]=min(dp[p][j],dp[pre][j-t[i][2]]+t[i][2]);
}
if(j>=t[i][1]&&t[i][1]!=0){
dp[p][j]=min(dp[p][j],dp[pre][j-t[i][1]]);
}
}
}
int ans=999999999;
for(int i=0;i<=sum;++i){
ans=min(ans,max(dp[n&1][i],i));
}
cout<<ans;
return 0;
}