产品加工

Tags
这算一道比较基础的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;
}