Pagini recente » Cod sursa (job #2590988) | Cod sursa (job #2988751) | Cod sursa (job #1913314) | Cod sursa (job #1208594) | Cod sursa (job #1797749)
#include <fstream>
using namespace std;
ifstream f("energii.in");
ofstream g("energii.out");
int minim(int a, int b)
{
return (a > b) ? b : a;
}
int maxim(int a, int b)
{
return (a > b) ? a : b;
}
int Energii(int e[], int c[], int G, int W)
{
int i, j;
int **a = new int*[G + 1];
for(i = 0; i < G + 1; i++)
a[i] = new int[W + 1];
a[G][W] = 0;
for(i = 0; i < G + 1; i++)
for(j = 0; j < W + 1; j++)
{
if(i == 0 || j == 0)
a[i][j] = 0;
else
{
if(e[i - 1] > j)
{
a[i][j] = a[i - 1][j];
}
else if(e[i - 1] == j)
{
if(a[i - 1][j] == 0)
a[i][j] = c[i - 1];
else
a[i][j] = minim(a[i - 1][j], c[i - 1]);
}
else
{
if(a[i - 1][j - e[i - 1]] != 0)
{
if(a[i - 1][j] != 0)
a[i][j] = minim(a[i - 1][j - e[i - 1]] + c[i - 1], a[i - 1][j]);
else
a[i][j] = a[i - 1][j - e[i - 1]] + c[i - 1];
}
else
a[i][j] = 0;
}
}
if(e[i - 1] >= W && a[G][W] != 0)
a[G][W] = minim(a[G][W], c[i - 1]);
}
int r = a[G][W];
for(i = 0; i < G + 1; i++)
delete[] a[i];
delete[] a;
return r;
}
int main()
{
int G, W, i;
f >> G >> W;
int *e = new int[G + 1], *c = new int[G + 1];
for(i = 0; i < G; i++)
f >> e[i] >> c[i];
int d = Energii(e, c, G, W);
if(d == 0)
g << -1;
else
g << d;
delete[] e;
delete[] c;
return 0;
}