Cod sursa(job #1208552)

Utilizator Kerriganamihut Kerrigan Data 16 iulie 2014 00:37:19
Problema Energii Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
/******************************************************************************************
*           .--.																		  *
* ::\`--._,'.::.`._.--'/::			@author Ana M. Mihut	@course InfoArena Tryout	  *
* ::::. `  __::__ ' .:::::			@alias  LT-Kerrigan		@date   08.07.2014			  *
* ::::::-:.`'..`'.:-::::::			@link   http://infoarena.ro/problema/energii		  *
* ::::::::\ `--' /::::::::			@detail knapsack not greedy *facepalm*				  *
*																						  *
*******************************************************************************************/

#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;

unsigned int G;
unsigned int W;

bool PassPreliminaryTest(vector<unsigned int> energy, unsigned int W ){
	unsigned int sumTest = 0;
	for (int i = 0; i < energy.size(); i++){
		sumTest += energy[i];
		if (sumTest >= W)
			return true;
	}
	return false;
}

void Solve(vector<unsigned int> Eg, vector<unsigned int> Cg, vector<unsigned int> Tcost){
	unsigned int flag = -1;

	for (int i = 0; i < G; i++) {
		for (int j = 2 * W; j >= Eg[i]; j--)
		{
			if ( (Tcost[j - Eg[i]]) && (!Tcost[j] || (Tcost[j - Eg[i]] + Cg[i] < Tcost[j])))
			{
				Tcost[j] = Tcost[j - Eg[i]] + Cg[i];

				if (j >= W)
					if ((flag == -1) || (Tcost[flag] > Tcost[j]))
						flag = j;
			}
		}
	}
	if (flag != -1)
		printf("%d\n", Tcost[flag] - 1);
}

int main(){

	freopen("energii.in", "r", stdin);
	freopen("energii.out", "w", stdout);
	
	scanf("%d %d", &G, &W);
	vector<unsigned int> Eg(G);
	vector<unsigned int> Cg(G);
	vector<unsigned int> Tcost(2*W+1, 0);
	Tcost[0] = 1;

	for (int i = 0; i < G; i++)
		scanf("%d %d", &Eg[i], &Cg[i]);

	if (!PassPreliminaryTest(Eg, W)){
		printf("-1\n");
		return 0;
	}

	Solve(Eg, Cg, Tcost);

	return 0;

}