Cod sursa(job #3254977)

Utilizator matwudemagogul matwu Data 9 noiembrie 2024 10:57:07
Problema Problema rucsacului Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.78 kb
#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;
    long double col = 0;
    g = d - g;
    //if(spw[n] - spw[pos - 1] + pmax1 <= pinit) return 0;
    for(int i = pos; i <= n; i++){
        if(g >= v[i].second){
            col += v[i].first;
            g -= v[i].second;
        }else{
            long double rez = (g * v[i].first)/(v[i].second * 1.0);
            col += rez;
            break;
        }
    }
    //long long tetra = (rez ? spw[rez] - spw[pos - 1] : 0);
    if(pinit > (long double) pmax1 + col){
        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;
}

/*
100 500
258 119
20 905
180 894
152 114
37 799
279 309
109 84
360 228
174 686
245 314
364 590
99 144
385 238
471 525
241 168
139 402
158 850
95 658
123 837
135 747
55 11
94 766
493 663
349 306
119 667
108 945
88 982
71 706
83 824
344 41
294 175
24 982
491 451
288 118
364 113
475 274
391 270
285 568
373 384
402 985
429 844
325 9
66 368
191 396
288 648
322 886
367 934
384 845
315 209
321 23
149 530
152 147
67 39
274 436
420 291
134 175
183 700
67 959
206 601
248 609
495 845
278 70
266 713
422 162
36 932
462 594
241 536
427 613
400 807
97 700
375 171
370 231
41 409
9 288
396 598
442 609
30 390
455 220
233 647
79 376
469 620
156 392
356 61
367 82
133 755
277 316
398 359
268 146
433 438
387 128
88 680
422 180
399 117
264 876
251 483
455 342
85 571
132 962
43 440
46 850


*/