Pagini recente » Cod sursa (job #1617918) | Cod sursa (job #1649703) | Cod sursa (job #373539) | Cod sursa (job #1011663) | Cod sursa (job #93751)
Cod sursa(job #93751)
#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;
}