Cod sursa(job #1007307)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 8 octombrie 2013 18:36:38
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <math.h>

#define nmax 5000

struct ob{
   int greutate, valoare;
   float raport;
}ob1;
ob heap[nmax];
int nrObiecte, N, G, gCurenta = 0,
               vCurenta = 0;

std::fstream in, out;

void swap(ob &a, ob &b){
   ob c = a;
   a = b;
   b = c;
}
void upHeap(int k){
   if (k / 2  && heap[k / 2].raport < heap[k].raport){
       swap(heap[k], heap[k / 2]);
       upHeap(k / 2);
   }
}
void downHeap(int k){
   if (2 * k <= nrObiecte)
       {
           int max = 2 * k;
           if (2 * k + 1 <= nrObiecte && heap[2 * k + 1].raport > heap[2 * k].raport)
               max = 2 * k + 1;
           if (heap[k].raport < heap [max].raport)
               {
                   swap (heap [k], heap [max]);
                   downHeap (max);
               }
       }
}

int main(){

   in.open("rucsac.in", std::ios::in);
   out.open("rucsac.out", std::ios::out);

   in >> N >> G;
   for (int i = 1; i <= N; i++){

       in >> ob1.greutate >> ob1.valoare;
       ob1.raport = (float)ob1.valoare / (float)ob1.greutate;
       heap[++nrObiecte] = ob1;

   }

   for (int i = N; i >= 1; i--){
       downHeap(i);
   }


   for(int i = 0; gCurenta + heap[1].greutate <= G; i++){
       gCurenta += heap[1].greutate;
       vCurenta += heap[1].valoare;
       swap(heap[1], heap[nrObiecte--]);
       downHeap(1);
   }

   if (gCurenta < G){
       int auxG = G - gCurenta;
       vCurenta += auxG * heap[1].raport;
   }


   std::cout << "Val:" << vCurenta << std::endl;


   in.close();
   out.close();

   return 0;
}