Cod sursa(job #333580)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 23 iulie 2009 11:53:50
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#define MaxG 1001
#define MaxW 1000001
using namespace std;

fstream fin ("energii.in", ios::in);
fstream fout("energii.out", ios::out);
int g, w, m[3][MaxG],maxim, poz_x;
int A[MaxW], minim;
bool uz[MaxW][MaxG];

int temp_uz;
int main(){
	
	fin>>g;
	fin>>w;
	maxim = 0;
	for (int i = 1; i <= g; ++ i){
		fin >> m[1][i] >> m[2][i];
		maxim += m[1][i];
	};
	A[0] = 0;

	for (int i = 1; i <= maxim; ++ i){
		temp_uz = 0;
		for (int j = 1; j <= g; ++ j){
			if (A[i] != 0 && m[1][j] <= i &&  A[i] > A[ i - m[1][j] ] + m[2][j] && uz[ i - m[1][j] ][ j ] == false){
				temp_uz = j;	
				A[i] = A[ i - m[1][j] ] + m[2][j];
			}
			else if ((A[i] == 0 || A[i] > m[2][j]) && m[1][j] == i){ 
				A[i] = m[2][j];
				temp_uz = j;
			}
			else if (A == 0 && m[1][j] < i && A[i - m[1][j]] != 0 && uz[ i - m[1][j] ][ j ] == false) {
				A[i] = A[i - m[1][j] ] + m[2][j];
				temp_uz = j;
			};
		};
		if (temp_uz != 0 && m[1][temp_uz] != i)
			for (int j = 1; j <= g; ++ j)
				uz[i][j] = uz[i - temp_uz][j];
		if (temp_uz != 0) uz[i][temp_uz] = true;
	};
	minim = 1999999999;
	for (int i = w; i <= maxim; ++ i)
		if (A[i] < minim && A[i] != 0){
			minim = A[i];
		};
	if (minim == 1999999999)
		fout<<-1;
	else fout<<minim;
			

						
			

	
};