Cod sursa(job #2394901)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 2 aprilie 2019 08:48:48
Problema Economie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define indAnt first
#define monedaAdaugata second
using namespace std;
ifstream fin("economie.in");
ofstream fout("economie.out");
int n,i,j,d[50003],v[1003],maxim,sol,poz,nr;
pair<int,int> t[50003];
int SOL[50003];
int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];


        maxim=max(maxim,v[i]);
    }
    for(i=1;i<=maxim;i++)
        d[i]=10000000;
    for(i=1;i<=maxim;i++){
        //fout<<"suma "<<i<<"poate fi obt din "<<d[i]<<"monede\n";
        for(j=1;j<=n;j++){
            //fout<<'\t'<<"incercam moneda j="<<j<<"de masa"<<v[j]<<"\n";
            if(i>=v[j]){
                //fout<<'\t'<<'\t'<<"o putem inlocui"<<"\n";
                //fout<<d[i]<<" "<<d[j]<<"\n";
                if(d[i-v[j]]+1<d[i]){
                    d[i]=d[i-v[j]]+1;
                    t[i].indAnt=i-v[j];
                    t[i].monedaAdaugata=v[j];
                }
            }
        }
    }
  //  for(i=1;i<=maxim;i++)
   //     fout<<d[i]<<" "<<t[i].indAnt<<" "<<t[i].monedaAdaugata<<"\n";
    for(i=1;i<=n;i++){
        poz=t[i].indAnt;
        while(poz!=0){
            if(SOL[t[poz].monedaAdaugata]==0)nr++;
            SOL[t[poz].monedaAdaugata]=1;
            poz=t[poz].indAnt;
        }
    }
    fout<<nr<<"\n";
    for(i=1;i<=n;i++)
        if(SOL[i]==1)
            fout<<i<<" ";

    return 0;
}