题目描述
有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的)。现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及去哪台机器加工,使得所有产品都成型的时间最早。机器之间互不相关,可以同时进行工作,一个机器一个时刻只能加工一个产品。
输入输出格式
输入格式:
第一行一个数n,表示产品个数,以下n行,每行两个数分别表示产品加工的时间A[i]和冷却时间B[i]。
【数据规模】
对于20%的数据,满足n≤6;
对于100%的数据,满足n,A[i],B[i]≤200。
输出格式:
一个数表示所有产品成型的最早时间。
输入样例#1:
3
1 4
3 3
4 1
输出样例#1:
6
题解
dp
先贪心,将物品按b降序排列,冷却时间长的先取
dp[i][j]表示前i个物品,在第一个机器上用了了j的加工时间所能得到的最小总时间(这时已经加上了冷却时间)。
dp[i][j]=min( d[i][j], max(dp[i-1][j-a[i].w],j+a[i].v) )这时把物品放到第一个包中,比较一下1号机器所需的时间,和没加之前二号机器所需的时间的最大值就是当前的总时间。
dp[i][j]=min( d[i][j],max(dp[i-1][j],sum[i]-j+a[i].v) )这时把物品放到第2个背包中,sum[i]就表示前i个物品所需的加工总时间(a),显然,我们在1号机器加工了j的时间,那么就肯定在2号机器加工了sum[i]-j的时间。
代码
#include<bits/stdc++.h>
#define F( i,a,b ) for( int i=( a );i<=( b );i++ )
#define F_2( i,a,b ) for( int i=( a );i>=( b );i++ )
#define N 201
#define M 10001
#define P 1000000007
#define LL long long
#define oo 0x7fffffff
using namespace std;
int read()
{
int f=1,s=0;
char ch=getchar();
while( ch<'0' || ch>'9' ) { if( ch=='-' ) f=-1; ch=getchar(); }
while( ch>='0' && ch<='9' ) { s=( s<<1 )+( s<<3 )+ch-'0'; ch=getchar(); }
return f*s;
}
int m,n,k;
int tot,ans,cnt;
int s[N],f[N][N*N];
struct node{
int w,v;
}a[N];
bool my_cmp( const node &a,const node &b )
{
return a.v>b.v;
}
int main()
{
n=read();
F( i,1,n )
{
a[i].w=read();
a[i].v=read();
}
sort( a+1,a+n+1,my_cmp );
F( i,1,n )
s[i]=s[i-1]+a[i].w;
F( i,1,n )
{
F( j,0,s[i] )
{
f[i][j]=oo;
if( j>=a[i].w )
f[i][j]=min( f[i][j],max( f[i-1][j-a[i].w],j+a[i].v ) );
if( s[i]-j>=a[i].w )
f[i][j]=min( f[i][j],max( f[i-1][j],s[i]-j+a[i].v ) );
}
}
int ans=oo;
F( i,1,s[n] )
ans=min( ans,f[n][i] );
cout<<ans<<endl;
return 0;
}