产品排序(rms模拟11-1)* *(dp)

题目描述

有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的)。现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及去哪台机器加工,使得所有产品都成型的时间最早。机器之间互不相关,可以同时进行工作,一个机器一个时刻只能加工一个产品。
输入输出格式
输入格式:

第一行一个数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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值