#include<bits/stdc++.h>
int dp[10010];
//least x spent with y(i) spent
int topvalue[10010];
//least y spent getting all x's i jelly
int find_maximum_unique(int x, int y, std::vector<int> a, std::vector<int> b) {
std::vector<std::pair<int,int>> comb;
std::vector<std::pair<int,int>> comb2;
for(int i=0;i<a.size();i++){
comb.push_back({a[i],b[i]});
}
for(int i=0;i<2020;i++){
topvalue[i]=1e9;
}
for(int i=0;i<a.size();i++){
comb2.push_back({comb[i].second,i});
}
std::sort(comb.begin(),comb.end());
std::sort(comb2.begin(),comb2.end());
int jelly=0;
for(auto [ca,cb]:comb){
for(int i=y;i>=0;i--){
if(dp[i]>=x)continue;
if(i>=cb){
//std::cout << cb << '*';
dp[i]=std::min(dp[i]+ca,dp[i-cb]);
}else dp[i]=dp[i]+ca;
//std::cout << dp[i] << ' ';
if(dp[i]>=x){
topvalue[jelly]=std::min(topvalue[jelly],i);
}
}//std::cout << '\n';
bool pos=false;
for(int i=0;i<=y;i++){
if(dp[i]<=x)pos=true;
}
if(!pos)break;
jelly+=1;
}
int best=jelly;
for(int i=0;i<=2000;i++){
if(topvalue[i]>y)break;
int yleft = y-topvalue[i];
int currentjelly = i;
for(int j=0;j<comb2.size();j++){
if(comb2[j].second<i)continue;
if(comb2[j].first>yleft)break;
yleft-=comb2[j].first;
currentjelly+=1;
}
best=std::max(best,currentjelly);
}
return best;
}