Cod sursa(job #2361263)

Utilizator patrickdanDan patrick patrickdan Data 2 martie 2019 14:10:16
Problema Ghiozdan Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#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;
}