Pagini recente » Cod sursa (job #2967019) | Cod sursa (job #2140671) | Cod sursa (job #110160) | Cod sursa (job #1318697) | Cod sursa (job #447545)
Cod sursa(job #447545)
/*
Problema : energii.
Categorie : PD- problema rucsacului.
Autor : Ilinca Diana.
Data : 28.04.2010
*/
#include <cstdio>
#define Nmax 1010
#define Wmax 5010
#define INF (1 << 30)
struct generator {int e, c;} G[Nmax];
int N, W;
int C[Wmax]; // C[i] = costul minim de a produce o cantitate de energie egala cu i
void citire () {
int i;
scanf ("%d", &N); // numarul de generatoare
scanf ("%d", &W); // cantitatea de energie necesara repornirii centralei
for (i = 1; i <= N; i++)
scanf ("%d %d", &G[i].e, &G[i].c); // energia produsa de un generator, respectiv costul sau
}
void dinamica () {
int i, j, wmax = 0, w, c;
for (i = 1; i <= W; i++)
C[i] = INF;
C[0] = 0; // energie 0 => costul 0
for (i = 1; i <= N; i++) { // parcurgem toate generatoarele si le integram in solutie
// in vectorul C vom avea costul cu care putem produce cantitatea i de energie sau INF daca nu o putem atinge
// wmax cantitatea maxima de energie produsa cu primele i-1 generatoare
for (j = wmax; j >= 0; j--)
if (C[j] != INF) {
// folosim generatorul i. => daca adugam catitatea produsa de generatorul i la j ajungem in starea j + G[i].e
w = j + G[i].e;
// costul va fi C[j] + G[i].c (costul actual de a ajunge in j + costul generatorului i)
c = C[j] + G[i].c;
if (w >= W) w = W; // are rost sa le luam pe alea mai mari ca W ? (logic ca nu).
if (C[w] > c)
C[w] = c; // actualizam costul daca se merita
if (w > wmax) wmax = w;
}
}
if (C[W] != INF) printf ("%d", C[W]);
else printf ("%d", -1);
// De ce nu putem face for`ul de la 0 la wmax ? :d (pt acasa)
}
int main () {
freopen ("energii.in", "r", stdin);
freopen ("energii.out", "w", stdout);
citire ();
dinamica ();
return 0;
}