按吃饭时间降序排序,然后动归,状态想到了就很简单了。
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
const int N=205;
struct arr {
int x,y;
}a[N];
int n,f[N][N*N],s[N];
bool cmp(const arr A,const arr B){
return A.y>B.y;
}
int main(){
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);
memset(s,0,sizeof s);
for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i].x;
memset(f,10,sizeof f);
f[0][0]=0;
for (int i=1;i<=n;i++)
for (int j=0;j<=s[i-1];j++){
f[i][j]=min(f[i][j],max(f[i-1][j],s[i-1]-j+a[i].x+a[i].y));
f[i][j+a[i].x]=min(f[i][j+a[i].x],max(f[i-1][j],j+a[i].x+a[i].y));
}
int ans=0x7fffff;
for (int i=0;i<=s[n];i++)
ans=min(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}