Pagini recente » Profil NicuBaciu | Rating Popa Sebastian (sebastianp2003) | Ultimul Cartus | Pitici2 | Cod sursa (job #1317466)
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define INFILE "energii.in"
#define OUTFILE "energii.out"
/* m[i][j] - minimum cost for elements from 1 .. i that produc min w energy */
unsigned int m[1002][5002];
unsigned int G, W;
unsigned int E[1002], C[1002];
#define MAX 1000000000
void read() {
FILE *f = fopen(INFILE, "r");
int i;
fscanf(f, "%u\n", &G);
fscanf(f, "%u\n", &W);
for (i = 1; i <= G; i++)
fscanf(f, "%u %u\n", &E[i], &C[i]);
fclose(f);
}
void write() {
FILE *f = fopen(OUTFILE, "w");
if (m[G][W] == MAX)
fprintf(f, "-1\n");
else
fprintf(f, "%u\n", m[G][W]);
fclose(f);
}
unsigned int min(unsigned int a, unsigned int b) {
if (a < b) return a;
return b;
}
void compute() {
int i, j, least, cur;
/* Initialize matrix */
for (i = 0; i <= W; i++)
m[0][i] = MAX;
for (i = 1; i <= G; i ++) {
least = MAX;
for (j = W; j > 0; j --) {
cur = m[i-1][j];
if (j >= E[i])
cur = min(cur, m[i-1][j-E[i]] + C[i]);
if (cur < least)
least = cur;
m[i][j] = least;
}
}
}
int main() {
read();
compute();
write();
return 0;
}