Pagini recente » Cod sursa (job #636673) | Cod sursa (job #1005545) | Cod sursa (job #2843893) | Cod sursa (job #386413) | Cod sursa (job #1323184)
// Problema rucsacului, dinamica O(N*G) timp, O(N*G) memorie
#include <fstream>
#include <algorithm>
using namespace std;
#define MAXN 5004
#define MAXG 10010
int N, G, Pmax;
bool u = 1,j = 0;
int W[MAXN], P[MAXN];
int D[2][MAXG];
int main()
{
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
// Citire
fin >> N >> G;
for(int i = 1; i <= N; ++i)
fin >> W[i] >> P[i];
// Dinamica D[i][cw] - profitul maxim pe care-l putem obtine adaugand o submultime a primelor i obiecte, insumand greutatea cw
for(int i = 1; i <= N; ++i){
for(int cw = 0; cw <= G; ++cw)
{
// Mai intai nu punem obiectul i.
D[j][cw] = D[u][cw];
// Daca acest lucru duce la o solutie curenta mai buna, adaugam obiectul i la o solutie anterioara.
if(W[i] <= cw)
D[j][cw] = max(D[j][cw], D[u][cw - W[i]] + P[i]);
}
swap(u,j);
}
// Solutia se va afla in statea D[N][G]
Pmax = D[u][G];
// Afisare
fout << Pmax;
return 0;
}