Pagini recente » Cod sursa (job #431653) | Cod sursa (job #2371444) | Cod sursa (job #483340) | Cod sursa (job #2234976) | Cod sursa (job #2274232)
///varianta standard, O(n*gmax)
#include<fstream>
#include <algorithm>
using namespace std;
fstream fin,fout;
int n,m,gmax, best[75005],prec[75005],info[75005],g[202],i,j,pmax,x,xmax,k;
struct pereche{
int g,v;
}a[20002];
bool comp(pereche a, pereche b){
if(a.g>b.g ||(a.g==b.g && a.v<b.v))return 1;
return 0;
}
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>>x; xmax=max(xmax,x);
g[x]++;
}
m=0;
for(i=xmax;i>=1;i--){
if(g[i]){
j=1;
while(j*2<=g[i]){
j=j*2;
}
if(j<g[i]){
m++;
a[m]={i,g[i]-j};
}
while(j){
m++;
a[m]={i,j};
j=j/2;
}
}
}
sort(a+1,a+m+1,comp);
for(i=1;i<=gmax;i++){
best[i]=infinit;
}
best[0]=0; pmax=0;
for(i=1;i<=m;i++){
for(k=gmax;k>=a[i].g;k--){
int r=a[i].g*a[i].v;
if(best[k-r]+a[i].v<best[k]){
best[k]=best[k-r]+a[i].v;
prec[k]=k-r;
info[k]=a[i].g;
}
}
}
for(i=gmax;i>=0;i--){
if(best[i]<infinit){
pmax=i;
break;
}
}
fout<<pmax<<" "<<best[pmax]<<"\n";
for(i=pmax;i!=0;i=prec[i]){
for(j=1;j<=(i-prec[i])/info[i];j++){
fout<<info[i]<<"\n";
}
}
fout.close();
fin.close();
return 0;
}