Cod sursa(job #735115)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 15 aprilie 2012 18:49:12
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#define N 550

using namespace std;

ifstream in("calatorie.in");
ofstream out("calatorie.out");

bool folosit[55][555];
long long a[55][555];


void adauga(int nr,int x,int y)
{
    int i;
    for(i=0;i<=N;++i)
    {
        if(folosit[nr-1][i]==false)
            continue;
        if(folosit[nr][i+y])
        {
            if(a[nr][i+y]>a[nr-1][i])
                a[nr][i+y]=a[nr-1][i];
        }
        else
        {
            folosit[nr][i+y]=true;
            a[nr][i+y]=a[nr-1][i];
        }
        if(folosit[nr][i])
        {
            if(a[nr][i]>a[nr-1][i]+x)
                a[nr][i]=a[nr-1][i]+x;
        }
        else
        {
            a[nr][i]=a[nr-1][i]+x;
            folosit[nr][i]=true;
        }
    }
   /* for(i=0;i<=N;++i)
    {
        if (folosit[nr][i])
            out<<i<<"("<<a[nr][i]<<")   ";
    }
    out<<"\n";*/
}


void solve()
{
    int n,j,x,y;
    long long p,minim=77700000000LL,i;
    in>>n;
    n--;
    if(n==0)
    {
        out<<"Consumul minim = "<<0<<".\n";
        return;
    }
    folosit[0][0]=true;
    for(i=1;i<=n;++i)
    {
        in>>x>>y;
        adauga(i,x,y);
    }
    for(i=0;i<=N;++i)
    {
        if(!folosit[n][i])
            continue;
        p=a[n][i]+i*i*i*i;
        if (p<minim)
            minim=p;
    }
    out<<"Consumul minim = "<<minim<<".\n";
    for(i=1;i<=n;++i)
        for(j=0;j<=N;++j)
        {
            folosit[i][j]=false;
            a[i][j]=0;
        }
}


int main()
{
    int i,t;
    in>>t;
    for(i=1;i<=t;++i)
    {
        solve();
    }
    return 0;
}