Cod sursa(job #900992)

Utilizator adascaluAlexandru Dascalu adascalu Data 28 februarie 2013 23:24:58
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include<vector>
#include<algorithm>
#include<utility>
#define nmax 1001
using namespace std;
 
vector<pair <int,int> > gen(nmax);
vector <long> D(5001+nmax);
int n,w,i;
long long cost_total;
long long 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,"%lld ",knapsack());
	//for(i=1;i<=w+4;i++)
		//fprintf(g,"%lld ",D[i]);
    fclose(f);
    fclose(g);
    return 0;
}
long long knapsack()
{
    long long cw,j;
	bool ok=true;
	for(cw=1;ok;cw++)
	{
		for(j=1;j<=n;j++)
		{
			if(gen[j].first==cw)
				D[cw]=gen[j].second;
			if(gen[j].first<=cw)
				D[cw]=max(D[cw],D[cw-gen[j].first]+gen[j].second);
		}
		if(cw>=w &&D[cw])
			ok=false;
	}
	
	return D[cw-1];
}