产品排序-DP

Description

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

Input

  第一行一个数n,表示产品个数
  以下n行,每行两个数分别表示产品的加工时间A[i]和冷却时间B[i]。

Output

  输出只有一个数表示所有产品成型的最早时间。

Sample Input

3
1 4
3 3
4 1

Sample Output

6

Hint

n<=200


思路:

参考:https://blog.csdn.net/qq_30303087/article/details/53129784

DP题:

先贪心,按照冷却时间从大到小排序

后DP,f[i][j]表示前i个产品,A机器用时间j完成生产的最短时间

第i个产品分给A:f[i][j]=max(f[i-1][j-A[i]],j+B[i])

第i个产品分给B:f[i][j]=max(f[i-1][j],Sum[i-1]-j+A[i]+B[i])=max(f[i-1][j],Sum[i]-j+B[i])

  • Sum[i]表示A[i]的前缀和

注意:前缀和应该在排序后再统计,而非输入时;


代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,suma[205],f[205][40005];
struct fdfdfd{int a,b;}e[205];
bool cmp(fdfdfd x,fdfdfd y){return x.b>y.b;}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d%d",&e[i].a,&e[i].b);
	sort(e+1,e+n+1,cmp);
	for(int i=1;i<=n;++i) suma[i]=suma[i-1]+e[i].a;
	memset(f,0x7f,sizeof(f)); f[0][0]=0;
	for(int i=1;i<=n;++i)
		for(int j=0;j<=suma[i];++j)
		{
			if(j>=e[i].a) f[i][j]=min(f[i][j],max(f[i-1][j-e[i].a],j+e[i].b));
            if(suma[i]-j+e[i].b>=0) f[i][j]=min(f[i][j],max(f[i-1][j],suma[i]-j+e[i].b));
		}
	int minn=0x7fffffff;
	for(int i=0;i<=suma[n];++i) minn=min(minn,f[n][i]);
	printf("%d\n",minn);
	return 0;
}
posted @ 2020-07-01 21:37  wuwendongxi  阅读(240)  评论(0编辑  收藏  举报