Cod sursa(job #1028860)

Utilizator Darius15Darius Pop Darius15 Data 14 noiembrie 2013 19:19:51
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <iostream>
#include <iomanip>

#define MAXE 10001
#define INFINIT 1000000000
#define DEBUG

using namespace std;

struct generator
{
    int e, c;
};

generator g[5001];
int G, W, l, cs, e, cn, lp, lc, minim, mc[2][10001];
ifstream fi ("energii.in");
ofstream fo ("energii.out");

/* Ideea de rezolvare:
   Pentru un rucsac de capacitate c, asociem obiectul curent (l), avand greutatea a[l].g,
   cu varianta optima obtinuta prin plasarea a l-1 obiecte intr-un rucsac cu capacitate c-a[l].g.

   Pentru o cantitate de energie w, asociem generatorul curent (l), care produce g[l].e energie,
   cu varianta optima obtinuta prin utilizarea a l-1 generatoare pentru a obtine w-g[l].e energie.
 */

int main()
{
    fi >> G >> W;
    for (l = 1; l <= G; l++)
        fi >> g[l].e >> g[l].c;
    lp = 0;
    lc = 1;
    for (e = 1; e <= MAXE-1; e++)
        mc[lp][e] = INFINIT;
    for (l = 1; l <= G; l++)   // pentru fiecare generator (cu rol de linie)
    {
        for (e = 0; e <= MAXE; e++)   // pentru fiecare cantitate de energie care se va analiza (cu rol de coloana)
        {
            cs = e - g[l].e; // coloana din stanga, care se combina cu energia generatorului curent
            if (cs >= 0)
                if (mc[lp][cs] < INFINIT)   // Exista o varianta pentru a obtine energia cs.
                {
                    cn = mc[lp][cs] + g[l].c; // costul nou, obtinut folosind generatorul l
                    if (cn < mc[lp][e])             // Avem cost mai mic folosind generatorul curent?
                        mc[lc][e] = cn;              // Retinem costul nou.
                    else
                        mc[lc][e] = mc[lp][e]; // Retinem costul obtinut cu primele l-1 generatoare.
                }
                else
                    mc[lc][e] = mc[lp][e]; // Retinem costul obtinut cu primele l-1 generatoare.
            else
                mc[lc][e] = mc[lp][e];
        }
        lp = 1-lp;
        lc = 1-lc;
    }
    minim = INFINIT;
#ifdef DEBUG
  for (e = 1; e <= 33; e++)
    if (mc[lp][e] < INFINIT)
      cout << '[' << setw(2) << e << ',' << mc[lp][e] << "] ";
    else
      cout << ". ";
#endif
    for (e = W; e <= MAXE-1; e++) // !!
        if (mc[lp][e] < minim)
            minim = mc[lp][e];
    fo << minim;
    return 0;
}