Cod sursa(job #902755)

Utilizator adascaluAlexandru Dascalu adascalu Data 1 martie 2013 16:31:38
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include<vector>
#include<algorithm>
#include<utility>
#define cost second
#define power first
#define nmax 1001
using namespace std;

vector<pair <int,int> > gen(nmax);
vector <int> D(10001);
int n,w,i;
int cost_total;
int knapsack();

int main()
{
    FILE *f,*g;
    f=fopen("energii.in","r");
    g=fopen("energii.out","w");
    fscanf(f,"%d%d",&n,&w);
    for(i=1;i<=n;i++)
        fscanf(f,"%d%d",&gen[i].first,&gen[i].second),cost_total+=gen[i].second;
    if(cost_total<w)
        fprintf(g,"%d",-1);
    else
        fprintf(g,"%d",knapsack());
    //for(i=1;i<=w+8;i++)
      //  fprintf(g,"%d ",D[i]);
    fclose(f);
    fclose(g);
    return 0;
}
int  knapsack()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=w-1;j>=1;j--)
            if(D[j]!=0)
                if(D[j]+gen[i].cost<D[j+gen[i].power] || D[j+gen[i].power]==0)
                    D[j+gen[i].power]=D[j]+gen[i].cost;
        if(D[gen[i].power]>gen[i].cost || D[gen[i].power]==0)
            D[gen[i].power]=gen[i].cost;
    }
    for(i=w;;i++)
        if(D[i])
        return D[i];
}