Cod sursa(job #838923)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 20 decembrie 2012 21:22:35
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#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;
}