Pagini recente » Cod sursa (job #784785) | Cod sursa (job #777850) | Cod sursa (job #2139464) | Cod sursa (job #901517) | Cod sursa (job #2495498)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rucsac.in");
ofstream out("rucsac.out");
int valori[1000];
int greutati[1000];
int raport[1000];
int main()
{
int n,capacitate,cnt,greutate,valoare,max,valFurat,cifra,cp,inceput,poz,cpVal,cpGreut;
in>>n;
in>>capacitate;
cnt=0;
while(cnt<n)
{
in>>greutate;
greutati[cnt]=greutate;
in>>valoare;
valori[cnt]=valoare;
raport[cnt]=valoare/greutate;
cnt++;
}
cnt=0;
///sortam vectorul cu rapoarte
///schimbam si pozitiile din vectorii cu valori si greutati
inceput=0;
poz=0;
while(cnt<n)
{
max=0;
cp=inceput;
while(cp<n)
{
if(raport[cp]>max)
{
max=raport[cp];
poz=cp;
}
cp++;
}
cp=raport[poz];
cpVal=valori[poz];
cpGreut=greutati[poz];
raport[poz]=raport[cnt];
valori[poz]=valori[cnt];
greutati[poz]=greutati[cnt];
valori[cnt]=cpVal;
greutati[cnt]=cpGreut;
raport[cnt]=cp;
cnt++;
inceput++;
}
///adunam valorile rapoartelor maxime pana depasim capacitatea
///inainte sa depasim continuam sa adunam restul de rapoarte cu greutatea/2 si valoarea/2
///dupa continuam sa adunam rapoartele ramase pana le terminam si le impartim la tot mai mult
cnt=0;
greutate=0;
valFurat=0;
while(cnt<n&&greutate<capacitate)
{
//int test=greutate+greutati[cnt];
if(greutate+greutati[cnt]<=capacitate)
{
greutate=greutate+greutati[cnt];
valFurat=valFurat+valori[cnt];
}
else
{
while(greutate+greutati[cnt]/cifra>capacitate)
{
cifra++;
}
greutate=greutate+greutati[cnt]/cifra;
valFurat=valFurat+valori[cnt]/cifra;
}
cifra=1;
cnt++;
}
out<<valFurat;
return 0;
}