Cod sursa(job #2275054)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 2 noiembrie 2018 20:08:25
Problema Ghiozdan Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
///varianta standard, O(n*gmax)
#include<fstream>
#include <algorithm>
using namespace std;
fstream fin,fout;
int n,m,gmax, v[20002], best[75005],last[75005],i,j,pmax,pmin,x,k,ok,_pmax,_pmin;
int infinit=100000;
int main(){
	fin.open("ghiozdan.in",ios::in);
	fout.open("ghiozdan.out",ios::out);
	fin>>n>>gmax;
	for(i=1;i<=n;i++)fin>>v[i];
	sort(v+1,v+n+1);
	for(i=1;i<=gmax;i++)best[i]=infinit;
	best[0]=0;last[0]=0;pmin=0;pmax=0;
    for(k=1;k<=n;k++){
        for(i=pmax;i>=pmin;i--){
            _pmax=pmax;
            _pmin=pmin;
            ok=1;
            if(best[i]<infinit){
                for(j=1+last[i];j<=n && i+v[j]<=gmax;j++){
                    if(best[i+v[j]]==infinit){
                        best[i+v[j]]=1+best[i]; last[i+v[j]]=j;
                        if(i+v[j]>_pmax) _pmax=i+v[j];
                        if(ok==1){ _pmin=i+v[j]; ok=0;}
                    }
                    else{
                        if(last[i+v[j]]>j) last[i+v[j]]=j;
                    }
                }
            }
        }
        pmax=_pmax;
        pmin=_pmin;
    }
    fout<<pmax<<" "<<best[pmax]<<"\n";

    for(i=pmax;i!=0;i=i-v[last[i]]){
        fout<<v[last[i]]<<"\n";
    }

	fout.close();
	fin.close();
	return 0;

}