Cod sursa(job #819521)

Utilizator vlad.bandacBandac Vlad Constantin vlad.bandac Data 19 noiembrie 2012 10:58:50
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
using namespace std;

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

void citire();
void pd();
void afisare();

int n;//nr de obiecte alfate la dispozitie
int Gmax;//greutatea rucsacului
int g[5000];//vectorul ce retine greutatea fiecarui obiect
int c[5000];//vectorul ce retine costul fiecarui obiect
int Cmax[5000];//castigul maxim ce se ppoate obtine cu un sac cu greutatea j
int uz[5000][5000];//initial uz este 0 peste tot

void citire(){
    int i,j;
    fin>>n;
    fin>>Gmax;
    for(i=1;i<=n;i++)
        fin>>g[i];
    for(j=1;j<=n;j++)
        fin>>c[j];
}

void pd(){
    int i,j,k;
    for(j=1;j<=Gmax;j++)
        Cmax[j]=-1;//cazul elementar
    
    for(j=1;j<=Gmax;j++)//j reprezinta greuatea sacului actual pana la cea actuala
        for(i=1;i<=n;i++)
            if(g[i]<=j && Cmax[j-g[i]]!=-1 && uz[j-g[i]][i]==0)
                if(Cmax[j]<c[i]+Cmax[j-g[i]]){//recalculam maximul
                    Cmax[j]=c[i]+Cmax[j-g[i]];
                    for(k=1;k<=n;k++)
                        uz[j][k]=uz[j-g[i]][k];
                    uz[j][i]=1;//marchez obiectul ca folosit
                }
}

void afisare(){
    int i;
    fout<<Cmax[Gmax]<<'\n';
    for(i=1;i<=n;i++)
        if(uz[Gmax][i])
            fout<<i<<' ';
    
}

int main(){
    citire();
    pd();
    afisare();
    fout.close();
    return 0;
}