Cod sursa(job #130493)

Utilizator scvalexAlexandru Scvortov scvalex Data 1 februarie 2008 12:40:50
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int inf = 1<<30;

int G(0),
	W(0);

int e[1001],
	c[1001];

int m[1001][5001];

#define MAX(a, b) ((a > b) ? (a) : (b))

int main(int argc, char *argv[]) {
	ifstream fin("energii.in");
	fin >> G >> W;
	for (int i(1); i <= G; ++i) {
		fin >> e[i] >> c[i];
	}
	fin.close();

	for (int i(1); i <= W; ++i)
		if (i <= e[1])
			m[1][i] = c[1];

	for (int i(1); i <= G; ++i)
		for (int j(1); j <= W; ++j)
			if (!m[i][j])
				m[i][j] = inf;

	for (int i(2); i <= G; ++i)
		for (int j(1); j <= W; ++j)
			if (j <= e[i]) {
				if (m[i - 1][j] < c[i])
					m[i][j] = m[i - 1][j];
				else
					m[i][j] = c[i];
			} else {
				if ((j - e[i] >= 1) && (m[i-1][j] > c[i] + m[i - 1][j - e[i]]))
					m[i][j] = c[i] + m[i - 1][j - e[i]];
				else
					m[i][j] = m[i - 1][j];
			}

	/*for (int i(1); i <= G; ++i) {
		for (int j(1); j <= W; ++j)
			cout << m[i][j] << "\t";
		cout << endl;
	}*/

	ofstream fout("energii.out");
	if (m[G][W] == inf)
		fout << -1 << endl;
	else
		fout << m[G][W] << endl;
	fout.close();

	return 0;
}