Cod sursa(job #18780)

Utilizator bughyBondane Bogdan bughy Data 18 februarie 2007 14:04:24
Problema Ghiozdan Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <stdio.h>
#include <stdlib.h>

#define input "ghiozdan.in"
#define output "ghiozdan.out"
#define dimmax 20001

long n,g,a[dimmax],k,rez,obj,pos[dimmax],rezultat[dimmax],count;

void poz(long ls,long ld,long& k);
void quick(long ls,long ld);
void back(long p,long sum);

int main()
{
        freopen(input,"r",stdin);
        freopen(output,"w",stdout);
        long i,j;
        
        scanf("%ld%ld",&n,&g);
        for(i=1;i<=n;i++)
          scanf("%ld",&a[i]);
          
        quick(1,n);
        
        back(1,0);
        printf("%ld %ld\n",rez,obj);
        for(i=1;i<=obj;i++)
           printf("%ld\n",a[rezultat[i]]);
           
//        for(i=1;i<=n;i++)
  //       printf("%ld ",a[i]);        
        return 0;
}

void quick(long ls,long ld)
{
    if(ls<ld)
    {
        poz(ls,ld,k);
        quick(ls,k-1);
        quick(k+1,ld);
    }
}
void poz(long ls,long ld,long& k)
{
    long i=ls,j=ld,i0=0,j0=-1,aux;
    while(i<j)
    {
        if(a[i]<a[j])
        {
          aux=a[i];
          a[i]=a[j];
          a[j]=aux;
          
          aux=i0;
          i0=-j0;
          j0=-aux;              
         }    
         
         i+=i0;
         j+=j0;
    }    
    k=i;
}    

void back(long p,long sum)
{
    int i;
    count++;
    if(count>=4000000) 
    {
        printf("%ld %ld\n",rez,obj);
        for(i=1;i<=obj;i++)
           printf("%ld\n",a[rezultat[i]]);
        exit(0);                 
    }    

    if(sum>rez)
    {
       rez=sum;
       obj=p-1;
       for(i=1;i<p;i++)
          rezultat[i]=pos[i];
    }     
    else
     if(sum==rez&&p-1<obj)
     {
       obj=p-1;
       for(i=1;i<p;i++)
          rezultat[i]=pos[i];
     }    
      
    for(i=pos[p-1]+1;i<=n;i++)
       if(sum+a[i]<=g)
       {
          pos[++pos[0]]=i;
          back(p+1,sum+a[i]);
          --pos[0];
       }
       else
         if(sum+a[i]>g)
           break;
}