Pagini recente » Cod sursa (job #2584437) | Cod sursa (job #300934) | Cod sursa (job #3153482) | Cod sursa (job #2383628) | Cod sursa (job #838923)
Cod sursa(job #838923)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("energii.in");
ofstream out("energii.out");
int a[1002][5002],W,G,E,C;
const int INF=300000;
//a[i][j]=costul minim necesar obtineii energiei j, folosind o submultime a primelor i generatoare
/*Folosesc programarea dinamica. Daca la un momentdat
energia unui generator, EG, este mai mica sau egala j,
atunci a[i][j], ia valoarea dintre costul minim necesar
producerii energiei j cu i-1 generatoare, sau costul minim
necesar producerii nergiei j-EG, cu i-1 generatoare.
Pe scurt: a[i][j]=min(a[i-1][j], a[i-1][j-EG]+EC).
Altfel, daca EG este mai mare decat j a[i][j] ia valoarea
dintre minimul de energie necesar producerii energiei j
cu i-1 generatoare, sau costul necesar producerii energiei EG.
Pe scurt: a[i][j]=min(a[i-1][j], EC);
Aceasta explicatie este foarte pe scurt. Posibil sa contina erori.
NOTA: Prin i-1 generatoare intelegem defapt o submultime a
primelor i-1 generatoare;
*/
int main()
{
int i,j;
in>>G>>W;//citire
//initializez matricea cu o valoarea mare
for(i=0; i<=G; i++)
for(j=1; j<=W; j++)
a[i][j]=INF;
for(i=1; i<=G; i++)
{
in>>E>>C;//citesc energia produsa de generatorul curent,
//si costul producerii acesteia
for(j=1; j<=W; j++)
{
if(E<=j)
{
a[i][j]=min(a[i-1][j], a[i-1][j-E]+C);
}
else
{
a[i][j]=min(a[i-1][j], C);
}
}
}
if(a[G][W]!=INF) out<<a[G][W];
else out<<-1;
return 0;
}