Cerința
Într-un magazin sunt n
obiecte; pentru fiecare se cunoaște greutatea G
și valoarea V
. Un hoț intră în magazin având un rucsac ce poate transporta o greutate maximă GMax
. El va fura anumite obiecte, sau porțiuni de obiecte, astfel încât suma greutăților obiectelor furate să nu depășească GMax
.
Să se stabilească câștigul maxim pe care îl poate obține hoțul. Câștigul este egal cu suma valorilor obiectelor furate. Câștigul adus de o fracțiune de obiect este direct proporțional cu greutatea fracțiunii.
Date de intrare
Programul citește de la tastatură numerele naturale n GMax
, iar apoi n
perechi de valori G V
, reprezentând greutatea, respectiv valoarea fiecărui obiect.
Date de ieșire
Programul va afișa pe ecran numărul C
, reprezentând câștigul maxim pe care îl poate obține hoțul.
Restricții și precizări
1 ≤ n ≤ 1000
;1 ≤ GMax, G, V ≤ 10000
;- rezultatul va fi punctat dacă diferența dintre cel afișat de program și cel corect este mai mică decât
0.01
.
Exemplu
Intrare
4 30 10 60 5 50 12 60 20 140
Ieșire
220
Explicație
Hoțul va lua obiectele 2
și 4
în întregime și jumătate din obiectul 1
, obținând un câștig de 220
.
#include <bits/stdc++.h> using namespace std; struct obiect { int greu, val; }; int n, gmax; obiect a[1005]; bool comp(obiect A, obiect B) { return A.val * B.greu > A.greu * B.val; } int main() { cin >> n >> gmax; for(int i=1 ; i<=n ; ++i) cin >> a[i].greu >> a[i].val; sort (a + 1 , a + n + 1, comp); int g = 0 , i = 1; double rez = 0; while(i <= n) { if(g + a[i].greu <= gmax) { g += a[i].greu; rez += a[i].val; i ++; } else if(gmax - g > 0) { double factor = 1.0 * (gmax - g) / a[i].greu; g = gmax; rez += factor * a[i].val; i++; } else i = n + 1; } cout << rez; return 0; }