Pagini recente » Cod sursa (job #1595744) | Cod sursa (job #2369749) | Cod sursa (job #1973614) | Cod sursa (job #184533) | Cod sursa (job #3254927)
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
int n, d;
vector<pair<int,int>> v;
vector<long long> spw, spg;
long long pmax, pinit,pmax1;
int viabil(int pos, int g){
int l = pos, r = n, rez = 0;
if(spw[n] - spw[pos - 1] + pmax1 <= pinit) return 0;
/*while(l <= r){
int tm = (l + r) / 2;
if(spg[tm] - spg[pos - 1] + g <= d){
l = tm + 1;
rez = max(rez, tm);
}else{
r = tm - 1;
}
}
long long tetra = (rez ? spw[rez] - spw[pos - 1] : 0);
if(pinit >= pmax1 + tetra){
return 0;
}*/
return 1;
}
void bkt(int pos, int g){
if(pos == n + 1) return;
if(!viabil(pos,g)) return;
if(g + v[pos].second <= d){
pmax1 += v[pos].first;
pinit = max(pinit, pmax1);
bkt(pos + 1, g + v[pos].second);
pmax1 -= v[pos].first;
}
bkt(pos + 1, g);
}
int main(){
cin >> n >> d;
v.assign(n + 1, {0,0});
for(int i = 1; i <= n; i++){
int w,p;
cin >> w >> p;
swap(p,w);
v[i] = {w,p};
}
sort(v.begin() + 1, v.begin() + 1 + n,[&](pair<int,int> a, pair<int,int>b){
long double p = (long double)a.first/(a.second * 1.0);
long double d = (long double)b.first/(b.second * 1.0);
return p > d;
});
int g1 = 0;
for(int i = 1; i <= n; i++){
if(g1 + v[i].second <= d){
g1 += v[i].second;
pmax += v[i].first;
}
}
spw.assign(n + 1, 0);
spg.assign(n + 1, 0);
for(int i = 1; i <= n; i++){
spw[i] = spw[i-1] + v[i].first;
spg[i] = spg[i-1] + v[i].second;
}
bkt(1,0);
cout << pinit;
}