设
f[i]
为
A
机器使用
如果
A
加工,那么
如果
B
加工,那么
如果
A,B
同时加工,那么
f[i]=Min(f[i],f[i−c[i]]+c[i])
为了更新
B
加工的情况,一开始的时候要将
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
template <class T>T Max(const T &a, const T &b) {return a > b ? a : b;}
template <class T>T Min(const T &a, const T &b) {return a < b ? a : b;}
const int SN = 6000 + 10;
const int SM = 30000 + 10;
const int inf = 0x3f3f3f;
int f[SM], n, a[SN], b[SN], c[SN], ans = inf,tot;
void Read(int &x) {
int in = 0,f = 1;char ch = getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f = -1;ch = getchar();}
while(ch>='0' && ch<='9') {in = in*10+ch-'0'; ch = getchar();}
x = in*f;
}
int main() {
Read(n);
for(int i = 1; i <= n; i++) {
Read(a[i]),Read(b[i]),Read(c[i]);
if(a[i] == 0) a[i] = inf;
if(b[i] == 0) b[i] = inf;
if(c[i] == 0) c[i] = inf;
tot += min(a[i],min(b[i],c[i]));
}
memset(f,inf,sizeof f);
f[0] = 0;
for(int i = 1; i <= n; i++)
for(int j = tot; j >= 0; j--) {
int tmp = f[j];f[j] = inf;
if(a[i] && j-a[i] >= 0) f[j] = Min(f[j] , f[j-a[i]]);
if(b[i]) f[j] = Min(f[j] , tmp+b[i]);
if(c[i] && j-c[i] >= 0 ) f[j] = Min(f[j] , f[j-c[i]]+c[i]);
}
for(int i = 0; i <= tot; i++) {
ans = Min(ans , Max(i,f[i]));
}
printf("%d\n",ans);
return 0;
}