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); }