显然可以想出f[i][j]表示前i个产品加工好A机器使用j的时间,B机器最少的使用时间
但是内存不够,于是考虑i可以不用记录,然后就ac了
#include<cstdio> #include<algorithm> #include<cctype> #define maxn 30001 using namespace std; int n,m,f[maxn],tot,a[maxn][3]; int read() { int c,x=0;while(!isdigit(c=getchar())); while(x=x*10+c-'0',isdigit(c=getchar())); return x; } int main() { n=read(); for(int i=1;i<=n;i++) { a[i][1]=read(),a[i][2]=read(),a[i][3]=read(); if(!a[i][1])a[i][1]=maxn; if(!a[i][2])a[i][2]=maxn; if(!a[i][3])a[i][3]=maxn; tot+=min(a[i][1],min(a[i][2],a[i][3])); } for(int i=1;i<=n;i++) { for(int j=tot;j>=0;j--) { int t=maxn; if(j>=a[i][1])t=min(t,f[j-a[i][1]]); if(j>=a[i][3])t=min(t,f[j-a[i][3]]+a[i][3]); t=min(t,f[j]+a[i][2]); f[j]=t; } } int ans=maxn; for(int i=0;i<=tot;i++)ans=min(ans,max(i,f[i])); printf("%d\n",ans); return 0; }