Cod sursa(job #271393)

Utilizator catalin93Catalin Ionescu catalin93 Data 5 martie 2009 11:15:56
Problema Dezastru Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>

int v[30];
double suma, prob[30];
int p;
int n;
int k,kfact2,nfact,kfact,n2;

int init()
{
	return 1;	
}

int exista( int t)
{
	if  (v[t]<n) 
		return 1;
	return 0;
}

int cond( int t)
{
	int i;	
//printf("cond pt t = %d\n",t);
	for(i=0;i<t;i++)
		if(v[i]>=v[t]){		//verificam sa fie diferit si sa fie mai mare ca sa fie unica solutia
//printf("nu este pt v[t] = %d si v[i] = %d\n",v[t],v[i]);
			return 0;	}
	return 1;
}

int solutie( int t)
{
	if(t==k)
		return 1;
	return 0;
}

void afisare(int t)
{
	int i;
	double temp;
	temp =1;
	
//	printf("debug----\n");
	//int j;
	//for(j=0;j<t;j++)
	//	printf("%d %f\t",v[j],prob[v[j]]);
	
	
	
	for(i=0;i<t;i++)
		temp *= prob[v[i]-1];
//	printf("temp: %f\t\n",temp);
	//temp/=p;
	temp*=kfact2;
	suma+=temp;
	//printf("\n");
}

void bkt(int t)
{
int i;
      if(solutie(t))
	  afisare(t);
      else
  
      for(i=init();i<=n;i++)	//for de la prima valoare valida la ultima valoare valida
  {
      v[t] = i;		//aici dami valorile posibile
      if(cond(t))	//verificare conditii pentru valoarea curenta
	  bkt(t+1);
    }

}



int main()
{
	int i;
	freopen("dezastru.in","r",stdin);
	freopen("dezastru.out","w",stdout);
	scanf("%d%d",&n,&k);
	
	for(i=0;i<n;i++)
		scanf("%lf",&prob[i]);
	nfact = 1;
	for(i=1;i<=n;i++)
		nfact *= i;
	kfact=1;
	n2 = n - k;
	for(i=1;i<=n2;i++)
		kfact *= i;
	kfact2=1;
	for(i=1;i<=k;i++)
		kfact2 *=i;
//	printf("qaz ");
//	fflush(stdout);
	
	p = nfact / kfact;
	
	suma=0;
	bkt(0);
	suma=suma/p;
	printf("%lf",suma);

return 0;
}