Cod sursa(job #2244744)

Utilizator victorv88Veltan Victor victorv88 Data 23 septembrie 2018 16:17:43
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("sant.in");
ofstream g("sant.out");

struct{
    int lungime, suma_ceruta;
}categorie[13];




int s, n,nr_categori,dp[55][105],sol[55],anterior[55][105];

void marcare()
{
    for (int i=0; i<55; i++)
    {
        for (int j=0; j<105; j++)
        {
            dp[i][j]=999999999;
        }
    }
}

void recursiv(int l, int col, int index)
{
    int dif;
    if (index==n)
    {
        sol[index]=dp[l][col];
        return;
    }
    sol[index]=anterior[l][col];
    recursiv(l-1,col-categorie[anterior[l][col]].suma_ceruta,index+1);

}

int main() {
    f >> s >> n >> nr_categori;
    marcare();
    for(int i=1; i<=nr_categori; i++)
    {
        f >> categorie[i].lungime >> categorie[i].suma_ceruta;
        dp[1][categorie[i].lungime]=categorie[i].suma_ceruta;
    }
    for (int i=2; i<=n; i++)
    {
        for (int j=1; j<=s; j++)
        {
            int mini=999999999;
            for (int q=1; q<=nr_categori; q++)
            {
                if (j-categorie[q].lungime>0)
                {
                    if (dp[i-1][j-categorie[q].lungime]+categorie[q].suma_ceruta<mini)
                    {
                        mini=dp[i-1][j-categorie[q].lungime]+categorie[q].suma_ceruta;
                        anterior[i][j]=q;

                    }

                }
            }
            dp[i][j]=mini;
        }
    }
    cout << dp[n][s] <<' ' << anterior[n][s] <<'\n';
    recursiv(n,s,1);
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=s; j++)
        {
            if (dp[i][j]==999999999)
                dp[i][j]=0;
            cout << dp[i][j] <<' ';
        }
        cout << '\n';
    }
    return 0;
}