【luogu2224】【BZOJ1222】 [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; }