Cod sursa(job #2115664)

Utilizator sandu.m.mdMorari Sandu sandu.m.md Data 26 ianuarie 2018 23:24:34
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
ifstream fin("file.in");
ofstream fout("file.out");

struct set
{
    int w, p, poz;
};

vector<set> arr;
vector<set> coada;
int n, g;
set aux;

bool cmp(set a, set b)
{
    float x = a.w, y = b.w;
    return (a.p / x) < (b.p / y);
}

int main()
{
    fin >> n >> g;
    for (int i = 0; i < n; i++)
    {
        fin >> aux.w >> aux.p;
        aux.poz = i + 1;
        arr.push_back(aux);
    }

    sort(arr.begin(), arr.end(), cmp);

    coada.push_back(arr[n - 1]);
    int sum = arr[n - 1].p;
    int weg = arr[n - 1].w;
    int i = n - 2;
    int poz = i;
    int cont = 0;
    while(i >= 0){
        //cout << "all: " << arr[i].poz << "\n";
        if(weg + arr[i].w <= g){
            //cout << "yes: " << arr[i].poz << "\n";
            coada.push_back(arr[i]);
            sum = sum + arr[i].p;
            weg = weg + arr[i].w;
            cont++;
            poz = i;
            //cout << "sum: " << sum << " weg: " << weg << "\n";
        }
        i--;
    }
    int  j = cont;
    int suma;
    int gr;
    for(int i = poz - 1; i >= 0; i--){
        suma = sum;
        gr = weg;
        while(j>=0){
            if(gr - coada[j].w + arr[i].w <= g ){
                if(suma - coada[j].p + arr[i].p > sum){
                    sum = suma - coada[j].p + arr[i].p;
                    weg = gr - coada[j].w + arr[i].w;
                }
                j--;
            }            
        }
    }

    /*
    for (int i = 0; i < n; i++){
        cout << arr[i].w << " " << arr[i].p << "\n";
    }*/
    cout << sum << "\n";
    /*
    for (int i = 0; i < n; i++){
        cout << arr[i].w << " " << arr[i].p << "\n";
    }
*/
return 0;
}