Pagini recente » Cod sursa (job #1181664) | Cod sursa (job #1694868) | Cod sursa (job #153009) | Cod sursa (job #2018119) | Cod sursa (job #607582)
Cod sursa(job #607582)
// 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)
{
if(P[a]!=P[b])
return P[a]>P[b];
return G[a]<G[b];
}
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 profit
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;
}