Cod sursa(job #20534)

Utilizator alex_aurelia_31Neamtu Alexandra alex_aurelia_31 Data 21 februarie 2007 18:38:09
Problema Ghiozdan Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
FILE *f,*gf;
int st[10000],as,ev,n,g,nmin,gmax,gr[1000],v[10000],max,min;
int nr;
void init(int k)
{
st[k]=-1;
}
int succesor(int k)
{
if(st[k]<1)
{
st[k]++;
return 1;
}
else
return 0;
}
int validare()
{
return 1;
}
int solutie(int k)
{
return k==n;
}
void tipar(int k)
{
int i,s=0;
for(i=1;i<=k;i++)
if(st[i]==1)
s+=gr[i];
if(s<=g)
{
if(max==0 || s>max)
{
max=s;
for(i=1;i<=k;i++)
if(st[i]==1 && gr[i]!=0)
{
v[i]=gr[i];
nr++;
}
}
}
}
void back(int k)
{
k=1;
init(k);
while(k>0)
{
do
{
as=succesor(k);
if(as)
ev=validare();
}
while((as==1)&&(ev==0));
if(as)
{
if(solutie(k))
tipar(k);
else
{
k++;
init(k);
}
}
else
k--;
}
}

int main()
{
f=fopen("ghiozdan.in","r");
gf=fopen("ghiozdan.out","w");
fscanf(f,"%d %d",&n,&g);
int i;
for(i=1;i<=g;i++)
fscanf(f,"%d",&gr[i]);
back(1);
gmax=max;
nmin=nr;
int q=0;
for(i=1;i<=nmin;i++)
if(v[i]!=0)
q++;
fprintf(gf,"%d %d\n",gmax,q);
for(i=1;i<=nmin;i++)
if(v[i]!=0)
fprintf(gf,"%d\n",v[i]);
fcloseall();
return 0;
}