Cod sursa(job #93751)

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


short int *vector, *cost, *energie;	//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;

//alocarea memoriei pentru cei trei vectori de cost, valoare si solutie a procedurii de backtracking
cost=new short[G];
energie=new short[G];
vector=new short[G];

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

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;
}