Cod sursa(job #93755)

Utilizator Ady.hAdrian Hada Ady.h Data 20 octombrie 2007 02:55:41
Problema Energii Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#include <stdlib.h>


short int vector[1002],cost[1002],energie[1002];	//vector se foloseste pentru generarea de solutii
short int G;	//numarul de generatoare
short int W;	//cantitatea de energie necesara repornirii centralei
int cost_minim=11000000,cost_curent=0,putere_curenta=0;

/*
inline void init(short k)
	{
	if (k == 0) vector[k]=-1;
		else
			vector[k]=vector[k-1];
	}
   */

 /*
void tipar(short int k)
	{
	for (int i=0;i<=k;i++)
		printf("%d ",*(vector+i));
   printf("%d %d",cost_curent,putere_curenta);
	printf("\n");
	}
*/

void bkt()
	{
   short int k=0;
	vector[k]=-1;
	while (k>-1) 
		{
		if (vector[k] < G-1)
			{
			vector[k]++;
			cost_curent=cost_curent-cost[vector[k]-1]+cost[vector[k]];
			putere_curenta=putere_curenta-energie[vector[k]-1]+energie[vector[k]];
			if (cost_curent < cost_minim) 
				{
				if (putere_curenta >= W)
            	{
   				cost_minim=cost_curent;
               }
				  	else
					 	{
						k++;
						vector[k]=vector[k-1];
						cost_curent+=cost[vector[k]];
						putere_curenta+=energie[vector[k]];
						}
				}
			
			}
		else
      		{
            cost_curent-=cost[vector[k]];
            putere_curenta-=energie[vector[k]];
            k--;
            }
			 
		}
	}

int main()
{
FILE *in;
in=fopen("energii.in","r");
fscanf(in,"%hd",&G);
fscanf(in,"%hd",&W);
int i=0,j=0,aux;

//printf("%d %d",G,W);
for (;i<G;i++)
	{
	fscanf(in,"%hd %hd",&energie[i],&cost[i]);
   //printf("%d %d ",energie[i],cost[i]);
	}
  // printf("\n");
fclose(in);

for (i=0;i<G-1;i++)
	for (j=i+1;j<G;j++)
   	if (cost[i]<cost[j])
      	{
         aux=cost[i];
         cost[i]=cost[j];
         cost[j]=aux;
         aux=energie[i];
         energie[i]=energie[j];
         energie[j]=aux;
         }

        // for (i=0;i<G;i++)
         //	printf("%d %d\n",energie[i],cost[i]);

bkt();

in=fopen("energii.out","w");
if (cost_minim == 11000000) fprintf(in,"%d",-1);
	else fprintf(in,"%d",cost_minim);

//inchiderea fisierelor si incheierea executiei
fclose(in);
return 0;
}