// с++ am scris un cod pentru problema rucsacului:
Problema continuă a rucsacului. Se consideră n obiecte. Pentru fi ecare obiect i (i=1,
2, ..., n) se cunoaște greutatea gi
și cîștigul ci
care se obţine în urma transportului său
la destinaţie. O persoană are un rucsac cu care pot fi transportate unul sau mai multe
obiecte greutatea sumară a cărora nu depășește valoarea Gmax. Elaboraţi un program
care determină ce obiecte trebuie să transporte persoana în așa fel încît cîștigul să fi e
maxim. În caz de necesitate, unele obiecte pot fi tăiate în fragmente mai mici.
// in imagine in cillui while dublu(locul unde este si comentarii) care realizeaza schimbarea valorilor variabilelor massivului,este realizat schimbul pentru fiecare element al masivului aparte,as vrea sami explicati cum pot fi schimbate cu locul valorile grupurilor de elemente,,
de exemplu in imagine avem un tablou bideminsional,cum de schimbat cu locul doar coloanele ci nu fiecare element din coloane cu cel din coloana alaturata,caci
aici e real de facut asta pentru 4 elemente,dar pentru 10000?Nu!Deci este nevoe de o metoda mai simpla.
//Alta intrebare e legata de inpartire, punind in programul dat / ,primesc doar partea intraga chiar daca puna tipul rezultatului un tip real.
//Daca gasiti alte greseli,sau aveti idei la rezolvare problemei,va rog sa le exprimati
Anexe:
Răspunsuri la întrebare
Răspuns de
5
Te pot ajuta in felul urmator : Urmareste problema "Rucsac fractionar" de pe varena.ro. Pentru enuntul acelei probleme iti trimit o sursa de 100p ...
#include <bits/stdc++.h>
using namespace std;
ifstream in ("rucsacfr.in");
ofstream out ("rucsacfr.out");
struct obiect
{
double val;
int cantitate;
bool operator < (obiect a)const
{
return val < a.val;
}
bool operator == (obiect a)const
{
return val == a.val;
}
};
obiect v[10000];
int main()
{
int n, k ,i;
double s = 0;
in>>n>>k;
for(i = 0 ; i < n ;i++)
{
in>>v[i].cantitate>>v[i].val;
v[i].val /= v[i].cantitate;
}
sort(v , v + n);
n--;
while(0 < k && 0 < n)
{
if(v[n].cantitate <= k)
{
s += v[n].val * v[n].cantitate;
k -= v[n].cantitate;
} else
{
s += k * v[n].val;
k = 0;
}
n--;
}
out<<fixed;
out<<setprecision(2);
out<<s;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
ifstream in ("rucsacfr.in");
ofstream out ("rucsacfr.out");
struct obiect
{
double val;
int cantitate;
bool operator < (obiect a)const
{
return val < a.val;
}
bool operator == (obiect a)const
{
return val == a.val;
}
};
obiect v[10000];
int main()
{
int n, k ,i;
double s = 0;
in>>n>>k;
for(i = 0 ; i < n ;i++)
{
in>>v[i].cantitate>>v[i].val;
v[i].val /= v[i].cantitate;
}
sort(v , v + n);
n--;
while(0 < k && 0 < n)
{
if(v[n].cantitate <= k)
{
s += v[n].val * v[n].cantitate;
k -= v[n].cantitate;
} else
{
s += k * v[n].val;
k = 0;
}
n--;
}
out<<fixed;
out<<setprecision(2);
out<<s;
return 0;
}
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă