Pagini recente » Cod sursa (job #1716557) | Cod sursa (job #236775) | Cod sursa (job #2866952) | Cod sursa (job #3246484) | Cod sursa (job #1166660)
/* Problema Rucsacului - O(N*G)
Se da o multime formata din N obiecte, fiecare fiind caracterizat de o greutate si un profit.
Sa se gaseasca o submultime de obiecte astfel incat suma profiturilor lor sa fie maxima,
iar suma greutatilor lor sa nu depaseasca o valoare G.
*/
#include <fstream>
#define Nmax 5009
#define Gmax 10009
using namespace std;
ifstream f("rucsac.in");
ofstream g("rucsac.out");
int N,G,gr[Nmax],p[Nmax],D[2][Gmax],k;
int main()
{
f>>N>>G;
for(int i=1;i<=N;++i)f>>gr[i]>>p[i];
k=1;
for(int i=1; i<=N ; ++i , k=1-k)
for(int cap=0;cap<=G;++cap)
{
D[k][cap]=D[1-k][cap]; //nu fur obiectul i
if(gr[i]<=cap) // daca pot sa bag obiectul i in ghiozdan
if(D[k][cap]<D[1-k][cap-gr[i]]+p[i]) // si daca iau mai mult la amanet
D[k][cap]=D[1-k][cap-gr[i]]+p[i];
}
g<<D[1-k][G]<<'\n';
return 0;
}