Pagini recente » Cod sursa (job #1736620) | Cod sursa (job #1681041) | Cod sursa (job #1649063) | Cod sursa (job #261768) | Cod sursa (job #607583)
Cod sursa(job #607583)
// Problema rucsacului, greedy O(N log N) timp, O(N) memorie
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 5010
#define MAXG 10010
int N, G, Pmax;
int W[MAXN], P[MAXN], pz[MAXN];
inline int cmp(int a, int b)
{
return P[a]*W[b]>P[b]*W[a];
}
int main()
{
freopen("rucsac.in", "r", stdin);
freopen("rucsac.out", "w", stdout);
// Citire
scanf("%d%d", &N, &G);
for(int i = 1; i <= N; ++i)
scanf("%d%d", &W[i], &P[i]);
// Sortam indicii obiectelor a.i acestea sa se afle in ordine descrescatoare dupa raportul profit/greutate
for(int i = 1; i <= N; ++i)
pz[i] = i;
sort(pz+1, pz+N+1, cmp);
// Parcurgem obiectele in aceasta ordine, iar daca un obiect mai incape in rucsac, il luam
int cw = 0;
for(int i = 1; i <= N; ++i)
{
if(cw + W[pz[i]] <= G)
{
cw += W[pz[i]];
Pmax+= P[pz[i]];
}
}
// Afisare
printf("%d\n", Pmax);
return 0;
}