Cod sursa(job #819521)
#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;
}