Sunteți pe pagina 1din 3

// Problema continua a rucsacului

#include <iostream>

using namespace std;

struct obiect
{
int cost, greutate, eficienta, ordine;
};

obiect ob[10],t;
int i,j,n;
int greutate_rucsac;
int castig;

int main()
{
cout<<"Dati greutatea care poate fi trasportata in rucsac ";
cin>>greutate_rucsac;
cout<<"Dati numarul de obiecte pe care doresc sa le incarc in rucsac ";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Dati costul trasportului pentru obiectul "<<i<<" ";
cin>>ob[i].cost;
cout<<"Dati greutatea obiectului "<<i<<" ";
cin>>ob[i].greutate;

ob[i].eficienta=ob[i].cost/ob[i].greutate;
ob[i].ordine=i;
}
//ordonam obiectele de incarcat descrescator dupa eficienta de transport
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if(ob[i].eficienta<ob[j].eficienta)
{
t=ob[i];
ob[i]=ob[j];
ob[j]=t;
}

castig=0; // initial castigul total obtinut la transportul


// obiectelor este zero
i=1;
int taiere=0;
// ne pozitionam pe primul obiect din lista de obiecte
// ne oprim la prima fragmentare / taiere sau pana am incarcat in rucsac toate obiectele

while(i<=n && taiere!=1)


{
if(greutate_rucsac>=ob[i].greutate) // daca obiectul poate fi incarcat in rucsac
{
greutate_rucsac = greutate_rucsac-ob[i].greutate; // modific greutatea rucsacului
cout<<"Am selectat pentru incarcare obiectul "<<ob[i].ordine<<endl;
castig = castig +ob[i].cost; // cumulez costul obiectului la castig
}
else
{
// aici obiectul de incarcat este mai mare decat spatiul liber din
// rucsac , aflu cat din el incarc in rucsac , impartind greutatea mica
// la greutatea mare
cout<<"Obiectul "<<ob[i].ordine<<" se va fragmenta intr-o bucatica de
"<<(float)greutate_rucsac/ob[i].greutate<<endl;
castig = castig + (ob[i].cost*greutate_rucsac)/ob[i].greutate;
taiere=1;
}
i++;
}
cout<<"Costul total al transportului obiectelor este "<<castig;
return 0;
}

S-ar putea să vă placă și