Pagini recente » Cod sursa (job #1171634) | Cod sursa (job #212882) | Cod sursa (job #3280020) | Cod sursa (job #189319) | Cod sursa (job #2700060)
// Mihai Priboi
#include <bits/stdc++.h>
#define MAXN 1000
#define MAXW 5000
#define MAXC 10000001
struct generator {
int e, c;
} v[MAXN];
int rucsac[2][MAXW + 1];
int main() {
FILE *fin, *fout;
int n, w, i, j, poz;
fin = fopen( "energii.in", "r" );
fscanf( fin, "%d%d", &n, &w );
for( i = 0; i < n; i++ )
fscanf( fin, "%d%d", &v[i].e, &v[i].c );
fclose( fin );
// pointers pentru usurinta la schimbarea liniilor
int *a, *b;
a = rucsac[1];
b = rucsac[0];
// prima linie este precalculata inainte ca sa evitam cazuri speciale
for( j = 1; j <= w; j++ )
b[j] = v[0].e >= j ? v[0].c : -1;
// problema rucsacului, pe fiecare pozitie costul minim pentru energia cel
// putin egala cu j, folosind primele i generatoare
for( i = 1; i < n; i++ ) {
for( j = 1; j <= w; j++ ) {
a[j] = b[j];
poz = j - v[i].e;
poz = poz < 0 ? 0 : poz;
if( b[poz] >= 0 )
a[j] = std::min( a[j] >= 0? b[j] : MAXC, b[poz] + v[i].c );
}
std::swap(a, b);
}
fout = fopen( "energii.out", "w" );
fprintf( fout, "%d", b[w] );
fclose( fout );
return 0;
}