Cod sursa(job #272821)

Utilizator nautilusCohal Alexandru nautilus Data 7 martie 2009 20:41:55
Problema Zebughil Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream.h>

ofstream fout("zebughil.out");

long nr,c,v[100],a[100],n,g;

int divide(int p, int q)
{
 int st=p, dr=q, x=a[p];

 while (st<dr)
	{
	 while (st<dr && a[dr]>=x)
		dr--;
	 a[st]=a[dr];

	 while (st<dr && a[st]<=x)
		st++;
	 a[dr]=a[st];
	}
 a[st]=x;

 return st;
}

void qsort(int p, int q)
{
 int m=divide(p,q);

 if (m-1>p)
	qsort(p,m-1);

 if (m+1<q)
	qsort(m+1,q);
}

void alegere(long suma, long poz)
{
 long upoz=0;

 while (suma+a[poz]<=g)
	{
	 if (v[poz]==0)
		upoz=poz;
	 poz++;
	}

 if (upoz!=0)
	{
	 suma=suma+a[upoz]; v[upoz]=1; nr--;
	}

 if (suma<g && nr>0 && upoz!=0)
	alegere(suma,upoz+1);
}

void alegere1elem()
{
 long i,suma;

 i=n;
 while (v[i]!=0)
	i--;

 c++;
 v[i]=1; suma=a[i]; nr--;
 if (nr>0)
	alegere(suma,1);

 if (nr>0)
	alegere1elem();
}

void calculare()
{
 long i;

 if (n==0)
	fout<<"0"<<'\n'; else
 if (n==1)
	fout<<"1"<<'\n'; else
	{
	 qsort(1,n);

	 c=0;

	 for (i=1; i<=n; i++)
		v[i]=0;

	 nr=n;

	 alegere1elem();

	 fout<<c<<'\n';
	}

}

int main()
{
 long i,j;

 ifstream fin("zebughil.in");

 for (i=1; i<=3; i++)
	{
	 fin>>n>>g;
	 for (j=1; j<=n; j++)
		fin>>a[j];

	 calculare();
	}

 return 0;
}