Cod sursa(job #3227513)

Utilizator code_blocksSpiridon Mihnea-Andrei code_blocks Data 1 mai 2024 17:01:48
Problema Problema rucsacului Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin("rucsac.in");
ofstream fout("rucsac.out");

int cost, weight;

int n, w_max, DP_prev[10001], DP_curr[10001];
// DP[i][j] = Suma maximă care se poate obține, având
// acces la primele i obiecte și la un rucsac cu
// greutate maximă j.

// Ținem doar două rânduri: DP_prev și DP_curr.
// E mai bine din punct de vedere al memoriei.

int knapsack()
{
    /*
    Deja adevărat din faptul că l-am declarat
    global pe DP_prev.

    for(int i = 1; i <= n; i++)
        DP_prev[i] = 0;
    */

    for(int i = 1; i <= n; i++)
    {
        fin >> weight >> cost;

        for(int j = 1; j <= w_max; j++)
            if(j - weight >= 0) // Dacă obiectul curent încape în rucsac:
                DP_curr[j] = max(DP_prev[j], DP_prev[j - weight] + cost);
                    // Văd ce e mai bine: fie folosesc configurația anterioară, DP[i - 1][j], fără a adăuga obiectul curent,
                    // fie adaug obiectul curent la configurație, ținând cont de greutatea sa, deci mă uit la configurația
                    // cu objs[i].weight greutate mai puțin.
            else
                DP_curr[j] = DP_prev[j]; // Obiectul curent nu încape în rucsac, nu pot îmbunătăți nimic.
    
        for(int j = 1; j <= w_max; j++)
            DP_prev[j] = DP_curr[j];
    }

    return DP_curr[w_max];
}

int main()
{
    fin >> n >> w_max;

    fout << knapsack();

    return 0;
}