题目描述
假期妈妈带小科去了一趟世界之窗,世界之窗中有N个分馆,每个分馆会展示一个国家标志性建筑以及国家的特色文化。
游览世界之窗的收费是这样的,世界之窗的大门是不用付门票费用的,但是游览每个分馆是需要付费的,游览一个分馆需要付两部分的费用,一部分是游览保险费b,另一部分是门票费w,也就是说游览一个会馆需要花费的钱数是b+w。另外假期世界之窗有一个优惠活动,就是可以减免一个分馆的门票费,但是保险费不变,也就是如果选择对一个分馆使用优惠就只需要支付保险费b即可。
小科当然想把所有的分馆都游览完,但是现实是骨感的,小科的妈妈只给了他M元钱,那小科如何选择才能游览尽量多的分馆呢?
输入格式
第一行,两个整数N和M,分别表示分馆的个数以及小科妈妈给他的总钱数。N≤1000,M≤10^9
接下来N行,每行两个整数bi wi分别表示每个分馆的保险费和门票费,其中每个整数都是≤10^9
输出格式
输出一行,一个整数,表示小科能够游览的最多的分馆的数量
输入输出样列
输入样例1:
5 1000 120 150 160 240 140 100 320 0 180 210
输出样例1:
4
说明
小科选择的馆是,第1、2、3、4这4个馆,对第2个馆使用优惠券,费用总额是(120+150)+ 160 +(140+100)+ 320=990元
【耗时限制】1000ms 【内存限制】256MB
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct youallturnintobirdslotsandlotsofbirds
{
long long p,s;
}a[1010];
bool cmp(const youallturnintobirdslotsandlotsofbirds &x,const youallturnintobirdslotsandlotsofbirds &y)
{
return x.p+x.s<y.p+y.s;
}
int main()
{
long long ans=0,m,n;
cin>>n>>m;
for(long long i=1;i<=n;i++)
{
cin>>a[i].p>>a[i].s;
}
sort(a+1,a+n+1,cmp);
long long cnt=0,sum=0;
for(long long i=1;i<=n;i++)
{
cnt=0;
sum=0;
sum=a[i].p;
if(sum>m) continue;
cnt++;
for(long long j=1;j<=n;j++)
{
if(j!=i)
{
sum+=a[j].p+a[j].s;
if(sum>m) break;
cnt++;
}
}
ans=max(ans,cnt);
}
cout<<ans;
return 0;
}