首先,我們要證明一定存在一個最優逃生序列ai滿足:
Aa*i + *Bai <= Aai+1 + Bai+1;
可採用反證法得知對於所有逃生序列ai,交換滿足存在:
Aa*i + *Bai > Aai+1 + Bai+1 的數對一定不會更差,從而得證;
這樣就爲我們提供了一個序,然後就可以dp啦
#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define rep2(i,k,n) for(int i=k;i>=n;i--)
using namespace std;
const int N=2017;
struct data{
int a,b;void in(){scanf("%d%d",&a,&b);}
}D[N];
bool cmp(data x,data y){return x.a+x.b < y.a+y.b;}
int H,n,l,f[N],ans=0;
int main(){
memset(f,-1,sizeof(f));f[0]=0;
scanf("%d",&n);
rep(i,1,n)D[i].in(),f[0]+=D[i].a;
scanf("%d",&H);
sort(D+1,D+n+1,cmp);
rep(i,1,n){
rep2(j,i-1,0)if(f[j]!=-1 && f[j]+D[i].b>=H){
f[j+1]=max(f[j+1],f[j]-D[i].a);
ans=max(ans,j+1);
}
}printf("%d\n",ans);
}