Pagini recente » Cod sursa (job #1147705) | Cod sursa (job #941362) | Cod sursa (job #1111372) | Cod sursa (job #3281628) | Cod sursa (job #2491838)
#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;
max=0;
///sortam vectorul cu rapoarte
///schimbam si pozitiile din vectorii cu valori si greutati
inceput=0;
cpGreut=0;
cpVal=0;
poz=0;
while(cnt<n)
{
cp=inceput;
while(cp<n)
{
if(raport[cp]>max)
{
max=raport[cp];
poz=cp;
}
cp++;
}
cp=raport[poz];
raport[poz]=raport[cnt];
raport[cnt]=cp;
cpVal=valori[poz];
valori[poz]=valori[cnt];
valori[cnt]=cpVal;
cpGreut=greutati[poz];
greutati[poz]=greutati[cnt];
greutati[cnt]=cpGreut;
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)
{
cifra=1;
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;
}
cnt++;
}
out<<valFurat;
return 0;
}