这算一道比较基础的01背包,只不过在转移状态的时候直接从新的状态中取就可以了,另外这题也使用了之前选数里面的技巧,使用另一个机器的时间作为价值进行更新。最后对下标和值取max再取min就可以了。
#include<bits/stdc++.h>
using namespace std;
int dp[30100];
int main(void){
int n ;scanf("%d",&n);
int a,b,c;
int up = 0;
for(int i = 1 ; i <= n ; i ++){
scanf("%d%d%d",&a,&b,&c);
up += max(a,max(b,c));
for(int j = up ; j >= 0 ; j --){
int inf = 0x3f3f3f3f;
if(c!=0&&j>=c){
inf = min(inf,dp[j-c]+c);
}
if(a!=0&&j>=a){
inf = min(inf,dp[j-a]);
}
if(b!=0)inf = min(dp[j]+b,inf);
dp[j] = inf;
}
}
int ans = INT_MAX;
// cout<<up;
for(int i = up ; i >= 0 ; i --){
ans = min(ans,max(dp[i],i));
}
cout<<ans;
return 0;
}