【luogu2224】【BZOJ1222】 [HNOI2001]产品加工 [动规 背包]

2224 [HNOI2001]产品加工

哭辽 决定以后手写比较函数QAQ

开始想了一个二维的 但不对 瓜想了半天决定看题解

发现这个变量的含义很熟悉f[i][j] 表示前i件产品,第一个机器用时j,第二个机器用时f[i][j]

然后就分三种情况来讨论 分别是用第一个机器 第二个机器 两个一起用 算是背包吧.... 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define rg register
const int N=6000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
int n,sum=0,f[M],ans=inf;
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)>(y)?(y):(x)

int main(){
//    freopen("in.txt","r",stdin);
    rd(n);
    for(int i=1,a,b,c;i<=n;++i){
        rd(a),rd(b),rd(c);
        sum+=Max(a,Max(b,c));
        if(!a) a=inf;if(!b) b=inf;if(!c) c=inf;
    for(int v=sum;v>=0;--v){
        if(b!=inf) f[v]+=b;
        else f[v]=inf;//用b 
        if(v>=a) f[v]=Min(f[v],f[v-a]);//用a
        if(v>=c) f[v]=Min(f[v],f[v-c]+c);//一起 
    }
    }
    for(int i=0;i<=sum;++i) ans=Min(ans,Max(i,f[i]));
    printf("%d",ans);
    return 0;
}
 
原文地址:https://www.cnblogs.com/lxyyyy/p/11173008.html