Cod sursa(job #3196111)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 22 ianuarie 2024 20:01:39
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <stdint.h>
#include <limits.h>

int64_t min(int64_t a, int64_t b) {
	return (a < b) ? a : b;
}

const int64_t MAX_G = 1000;
const int64_t MAX_W = 5000;
const int64_t MAX_EG = 10000;
const int64_t MAX_CG = 10000;
const int64_t MAX_COST = MAX_EG * MAX_CG + 1;

int64_t mat[MAX_G][MAX_W];
int main() {
	std::ifstream fin("energii.in");
	std::ofstream fout("energii.out");

	int64_t g, w;
	fin >> g >> w;

	for(int64_t i = 0; i != g; ++i)
		for(int64_t j = 0; j <= w; ++j)
			mat[i][j] = MAX_COST;

	int64_t minSum = MAX_COST;
	for(int64_t i = 0; i != g; ++i) {
		int64_t eg, cg;
		fin >> eg >> cg;

		if(i) {
			for(int64_t j = 0; j < w; ++j) {
				if(mat[i - 1][j] != MAX_COST) {
					mat[i][j] = min(mat[i][j], mat[i - 1][j]);
					if(j + eg >= w) {
						int64_t sum = mat[i - 1][j] + cg;
						if(sum < minSum) {
							minSum = sum;
						}
					} else {
						mat[i][j + eg] = min(mat[i][j + eg], mat[i - 1][j] + cg);
					}
				}
			}
		}
		if(eg >= w) {
			int64_t sum = cg;
			if(sum < minSum) {
				minSum = sum;
			}
		} else {
			mat[i][eg] = min(mat[i][eg], cg);
		}
	}

	if(minSum == MAX_COST)
		minSum = -1;
	fout << minSum;

	fin.close();
	fout.close();

	return 0;
}