题目大意,题面已经很清晰了。
贪心+dp
首先按照身高+臂长衡量一个矮人的逃生能力,让逃生能力弱的先走(在最有方案中)是最好的,所以按照这个值排序,然后就可以dp了。
f[i]表示走了i个人后剩下最高高度是多少,暴力转移。
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=(1<<28);
int n;
struct node{
int a,b;
}a[100010];int h,ans=0,f[2010];
bool cmp(node a,node b){return a.a+a.b>b.a+b.b;}
bool cmp1(node a,node b){return a.a>b.a;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d %d",&a[i].a,&a[i].b);
scanf("%d",&h);
sort(a+1,a+n+1,cmp);
int p=1;
while(p<=n&&a[p].a+a[p].b>=h) h-=a[p].a,ans++,p++;
memset(f,-1,sizeof(f));f[0]=0;
if(p<=n)
{
for(int i=p;i<=n;i++) f[0]+=a[i].a;
for(int j=n;j>=p;j--)
for(int i=n-p+1;i>=1;i--)
if(f[i-1]!=-1&&f[i-1]+a[j].b>=h) f[i]=max(f[i],f[i-1]-a[j].a);
}
for(int i=1;i<=n-p+1;i++)
if(f[i]!=-1) ans++;
else break;
printf("%d",ans);
}