51nod1339飞行任务

时间:2022-09-19 05:42:39

首先按照收获从大到小排序。

然后01背包取或者不取即可。

至于为什么这样对的其实我也不知道。。。。

代码:

#include<bits/stdc++.h>
using namespace std;
int T,n,f;
struct xx
{
int d,r,val;
}num[];
inline bool cmp(xx a,xx b)
{
if(a.r==b.r)return a.d>b.d;
return a.r>b.r;
}
int jiyi[][];
int dp(int now,int val)
{
int &fanhui=jiyi[now][val];
if(fanhui!=-)return fanhui;
if(now==n+)return fanhui=;
fanhui=dp(now+,val);
if(val>=num[now].d)
fanhui=max(dp(now+,val-num[now].val)+,fanhui);
return fanhui;
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(jiyi,-,sizeof(jiyi));
scanf("%d%d",&n,&f);
for(int i=;i<=n;i++)
{
scanf("%d%d",&num[i].d,&num[i].r);
num[i].val=num[i].d-num[i].r;
}
sort(num+,num+n+,cmp);
printf("%d\n",dp(,f));
}
return ;
}