Pagini recente » Cod sursa (job #2486681) | Cod sursa (job #2645240) | Cod sursa (job #2639142) | Cod sursa (job #2737808) | Cod sursa (job #2275054)
///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;
}