Cod sursa(job #1654501)

Utilizator valentin50517Vozian Valentin valentin50517 Data 17 martie 2016 10:04:47
Problema Problema rucsacului Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
// 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;
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[u][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[u][cw] = max(D[u][cw], D[!u][cw - W[i]] + P[i]);            
        }
        u = !u;
    }
    u = !u;
    // Solutia se va afla in statea D[N][G]
    Pmax = D[u][G];
  
    // Afisare
    fout << Pmax;
    return 0;
}