BZOJ1222_ 产品加工_KEY

题目传送门

我们设f[i]表示用机器A加工,时间还剩下i时的最优加工时间。

对于每一个时间可以加工的物品,有以下几个选择:

1、用机器A加工

2、用机器B加工

3、A和B一起加工

所以得到方程:

f[j]+=a[i][2]//用机器B加工,所以时间还剩j。

f[j]=min(f[j],f[j-a[i][1])(j>=a[i][1])//用机器A加工,所以由j-a[i][1]转移来。

f[j]=min(f[j],f[j-a[i][3]]+a[i][3])//用A、B一起加工,因为A也要出力,B也要出力,在减去a[i][3]的同时也要加上a[i][3]。

code:

/**************************************************************
    Problem: 1222
    User: yekehe
    Language: C++
    Result: Accepted
    Time:2084 ms
    Memory:1052 kb
****************************************************************/
 
#include <cstdio>
using namespace std;
inline int read(){
    char c;while(c=getchar(),(c<'0'||c>'9')&&c!='-');int x=0,y=1;c=='-'?y=-1:x=c-'0';
    while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';return x*y;
}
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
int n,a[6001][4],f[35001];
int main(){
    n=read();
    int m=0;
        for(int i=1;i<=n;i++){
            a[i][1]=read();a[i][1]=a[i][1]==0?30005:a[i][1];
            a[i][2]=read();a[i][2]=a[i][2]==0?30005:a[i][2];
            a[i][3]=read();a[i][3]=a[i][3]==0?30005:a[i][3];
            m+=min(min(a[i][1],a[i][2]),a[i][3]);
        }
    f[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                f[j]+=a[i][2];
                if(j>=a[i][1])f[j]=min(f[j],f[j-a[i][1]]);
                if(j>=a[i][3])f[j]=min(f[j],f[j-a[i][3]]+a[i][3]);
            }
        }
    int ans=30005;
        for(int i=0;i<=m;i++)ans=min(ans,max(i,f[i]));
    printf("%d",ans);
}
原文地址:https://www.cnblogs.com/Cptraser/p/7595204.html