#include "stdio.h"
#include "iostream"
using namespace std;
bool dp[45][405][805];
int n;
struct node{
int t1;//cpu
int t2;//cpu+gpu
int t3;//cpu*2&cpu*2+gpu
int mst;//目前最大时间上限
int sml;//目前最小时间下限
}obj[45];
inline int mn (int x, int y) { return x <y ?x :y ;}
inline int mx (int x, int y, int z) {
return (x >y ?x :y ) > z ?(x >y ?x :y ) :z;
}
inline int mn3 (int x, int y, int z) {
return (x <y ?x :y ) < z ?(x <y ?x :y ) :z;
}
void init(){
cin>>n;
int a,b,c,d,i;
for (i=1;i<=n;i++){
cin>>a>>b>>c>>d;
obj[i].t1=a;
obj[i].t2=c;
obj[i].t3=mn(b,d);
obj[i].mst=obj[i-1].mst+mx(a,c,obj[i].t3);
obj[i].sml=obj[i-1].sml+mn3(a,c,obj[i].t3);
}
}
void work(){
int i,j,k,ans;
const int tz=401,oo=100005;//向上调整
dp[0][0][tz]=true;
for (i=1;i<=n;i++){ ans=oo;
for (j=obj[i].sml;j<=obj[i].mst;j++){
for (k=tz-obj[i].mst;k<=tz+obj[i].mst;k++){
//dp[i][j][k]表示前i件物品消耗时间为j空余资源为k的方案可行性
if(k+obj[i].t1<=tz)
dp[i][j][k]|=dp[i-1][j][k+obj[i].t1];
else
dp[i][j][k]|=dp[i-1][j-k-obj[i].t1+tz][k+obj[i].t1];
//考虑第一种时间方案 1 补方案2的缺口
if(k-obj[i].t1>=tz)
dp[i][j][k]|=dp[i-1][j][k-obj[i].t1];
else
dp[i][j][k]|=dp[i-1][j-tz-obj[i].t1+k][k-obj[i].t1];
//考虑第一种时间方案 2 补方案1的缺口
if(k-obj[i].t2>=tz)
dp[i][j][k]|=dp[i-1][j][k-obj[i].t2];
else
dp[i][j][k]|=dp[i-1][j-tz-obj[i].t2+k][k-obj[i].t2];
//考虑第二种时间方案
if(j>=obj[i].t3)
dp[i][j][k]|=dp[i-1][j-obj[i].t3][k];
if(dp[i][j][k])
ans=mn(ans,j);
}
}
}
printf("%d\n",ans);
}
int main(){
freopen("cpugpu.in","r",stdin);
freopen("cpugpu.out","w",stdout);
init();
work();
return 0;
}
来不及改了,应该差不多,思想就是这样了