显然可以想出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;
}

 

posted on 2018-05-11 12:40  geniuschenjj  阅读(144)  评论(0编辑  收藏  举报