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
",minn);
return 0;
}