产品加工
大致题意:
有两台机器,n件产品,每件产品分别给出在A机器和B机器加工的时间,以及同时在两台机器加工分别需要的时间.如果值为0,表示不能在该机器上加工.
求加工所有产品所需的最短时间
解题思路:
状态表示:f[i][j]表示前i件产品,第一个机器用j时间,第二个机器用f[i][j]时间
优化掉第一维,不然转移会超时
在第一台机器上加工 f[j] = min(f[j], f[j - a])
在第二台机器上加工 f[j] += b
两台机器同时加工 f[j] = min(f[j], f[j - c] + c)
转移方程: f[j] = min(f[j - a], f[j] + b, f[j - c] + c)
最后结果使最大值最小
AC代码:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 30010;
int n, m;
int f[N];
int main(void)
{
cin >> n;
memset(f, INF, sizeof f); f[0] = 0;
for (int i = 1; i <= n; ++i) {
int a, b, c; cin >> a >> b >> c;
m += max(a, max(b, c));
for (int j = m; j >= 0; --j) {
if (b)f[j] += b;
else f[j] = INF; //确保产品的状态可以从A机器加工或者AB机器同时加工转移过来
if (a && j >= a)f[j] = min(f[j], f[j - a]);
if (c && j >= c)f[j] = min(f[j], f[j - c] + c);
}
}
int res = INF;
for (int i = 0; i <= m; ++i)
res = min(res, max(i, f[i]));
cout << res << endl;
return 0;
}