Cod sursa(job #2768214)

Utilizator Darius_CDarius Chitu Darius_C Data 9 august 2021 20:36:39
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
// Energii.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
// Problema rucsacului varianta discreta
// dp[cw+E[i]] = min(dp[cw+E[i], dp[cw]+C[i])

#include <iostream>
#include <fstream>
#include <algorithm>
#pragma warning(disable: 4996)
#define INF 0x3F3F3F3F
#define MAXG 1006
#define MAXW 5006
using namespace std;

FILE* fin, * fout;

int G, W;
int E[MAXG], C[MAXG];
int dp[MAXW];

static inline void Read()
{
	fscanf(fin, "%d %d", &G, &W);
	for (int i = 1; i <= G; i++)
		fscanf(fin, "%d %d", &E[i], &C[i]);
	for (int i = 1; i <= W; i++)
		dp[i] = INF;
}

static inline void KnapSack()
{
	for (int i = 1; i <= G; i++)
	{
		for (int cw = W - E[i]; cw >= 0; cw--)
			dp[cw + E[i]] = min(dp[cw + E[i]], dp[cw] + C[i]);
		for (int cw = E[i] - 1; cw >= 1; cw--)
			dp[cw] = min(dp[cw], C[i]);
	}
	dp[W] == INF ? fprintf(fout, "%d", -1) : fprintf(fout, "%d", dp[W]);
}

int main()
{
	fin = fopen("energii.in", "r");
	fout = fopen("energii.out", "w");
	Read();
	KnapSack();
	fclose(fin);
	fclose(fout);
	return 0;
}