Pagini recente » Cod sursa (job #69837) | Cod sursa (job #883784) | Cod sursa (job #1630464) | Cod sursa (job #2044566) | Cod sursa (job #2361263)
#include <cstdio>
using namespace std;
int f[201];
int sol1[201];
int dersol[201];
int dif,sol,g,derobj,max,epuiz;
void verif(int gr)
{
int obj=0;
for(int j=1;j<=max;j++)
obj+=sol1[j];
if(g-gr<g-sol){
sol=gr;
derobj=obj;
for(int j=1;j<=max;j++)
dersol[j]=sol1[j];
}
else
if(g-gr==g-sol && derobj>obj){
obj=derobj;
for(int j=1;j<=max;j++)
dersol[j]=sol1[j];
}
}
void rec(int gr,int nr)
{
int i,cop,cnr;
cnr=nr;
for(i=1;i<=max;i++){
if(f[i]!=0){
cnr--;
if(cnr-epuiz<=0)
{
gr=gr+i;
cop=f[i];
f[i]--;
sol1[i]++;
while(gr<=g && f[i]>=0)
{
if(f[i]==0)
epuiz++;
rec(gr,nr+1);
gr=gr+i;
sol1[i]++;
f[i]--;
}
epuiz--;
sol1[i]--;
gr-=i;
verif(gr);
f[i]=cop;
gr=gr-cop*i;
sol1[i]=0;
}
}
}
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
int n,x,i;
scanf("%d%d",&n,&g);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>max)
max=x;
if(f[x]==0)
dif++;
f[x]++;
}
rec(0,1);
int nrsol=0;
for(i=1;i<=200;i++)
if(dersol[i]!=0)
nrsol+=dersol[i];
printf("%d %d\n",sol,nrsol);
for(i=1;i<=200;i++)
while(dersol[i]!=0)
{
printf("%d\n",i);
dersol[i]--;
}
return 0;
}