Cod sursa(job #18630)

Utilizator undogSavu Victor Gabriel undog Data 18 februarie 2007 12:50:14
Problema Tricouri Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 9-a si gimnaziu Marime 1.1 kb
#include <stdio.h>

void compl(int);
int final(int);
int valid(int);
void scrie();

int n,c=0,tric[1000],m,k,p2,max,pick[1000][2],sum;

void main()
{
 FILE *in=fopen("tricouri.in","rt"),*out=fopen("tricouri.out","w+");
 int i,j;
 fclose(out);
 fscanf(in,"%d%d",&n,&m);
 for(i=0;i<n;i++)
  fscanf(in,"%d",&tric[i]);

 for(i=0;i<m;i++){
  max=0;
  fscanf(in,"%d%d",&k,&p2);
  for(j=0;j<k;j++)
   pick[j][1]=-1;
  compl(0);
 FILE *out=fopen("tricouri.out","a");
 if(max)
  fprintf(out,"%d\n",max);
 else
  fprintf(out,"-1\n");
 fclose(out);

 }


 fclose(in);
}

void fmax(){
 if(sum>max)
  max=sum;
}

void compl(int p)
{
 int v;
 for(v=0;v<n;v++)
    {
     c=0;
     for(int i=0;i<k;i++)
      if(v==pick[i][1])
       c=1;
     if(c)continue;
     pick[p][0]=tric[v];
     pick[p][1]=v;
      if(valid(p))
       if(final(p)) fmax();
       else compl(p+1);
    }
}

int final(int p)
{
 return p==k-1;
}


int valid(int p)
{
 if(p!=k-1)return 1;
 int i;sum=0;
 for(i=0;i<k;i++)
  sum+=pick[i][0];

 if(sum%p2==0)
  return 1;
 else
  return 0;
}