Pagini recente » Cod sursa (job #2092627) | Cod sursa (job #361974) | Cod sursa (job #148125) | Cod sursa (job #2626230) | Cod sursa (job #475338)
Cod sursa(job #475338)
#include <iostream>
#include <string>
using namespace std;
#define GMAX 1005
#define WMAX 20005
#define inf 2000000000
int G, W, CMIN[WMAX][2], EC[GMAX], CC[GMAX], EMAX;
int main()
{
freopen ("energii.in", "r", stdin);
freopen ("energii.out", "w", stdout);
scanf ("%d\n%d\n", &G, &W);
for (int i = 1; i <= G; ++i)
scanf ("%d %d\n", &EC[i], &CC[i]);
//memset
for (int i = 0; i < WMAX; ++i)
{
CMIN[i][0] = inf;
CMIN[i][1] = inf;
}
CMIN[0][0] = 0;
for (int i = 1; i <= G; ++i)
{
int cur = i % 2;
int prev = !cur;
EMAX += EC[i];
EMAX = min(EMAX, 20000);
//prima parte
for (int j = 0; j < EC[i]; ++j)
CMIN[j][cur] = CMIN[j][prev];
//a doua parte
for (int j = EC[i]; j <= EMAX; ++j)
{
int v1 = CMIN[j - EC[i]][prev] + CC[i];
int v2 = CMIN[j][prev];
CMIN[j][cur] = min(v1,v2);
}
for (int j = EMAX - 1; j >= 0; --j) CMIN[j][cur] = min(CMIN[j][cur], CMIN[j+1][cur]);
}
if (CMIN[W][G%2] == 2000000000) CMIN[W][G%2] = -1;
printf ("%d", CMIN[W][G%2]);
return 0;
}