Cod sursa(job #652277)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 23 decembrie 2011 18:32:32
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<cstdio>
#define inf 0xfffffff
#define min(a, b) (a) < (b) ? (a) : (b)
using namespace std;

int eg[1001], cg[1001], dp[2][10001];
//dp[i][j] = costul minim, alegand numai din primele i generatoare, cu care pot genera j unitati de energie
//se obs ca linia curenta depinde doar de ultima linie calculata

int main(){
	freopen("energii.in", "r", stdin), freopen("energii.out", "w", stdout);
	int G, W, i, j, min;
	scanf ("%d %d", &G, &W);
	for (i = 1; i <= G; i++)	scanf ("%d %d", &eg[i], &cg[i]);
	
	for (i = 0; i < 2; i++)
		for (j = 1; j <= 10001; j++) dp[i][j] = inf;
	
	for (i = 1; i <= G; i++)
		for (j = 0; j <= 10001; j++){
			if (j >= eg[i] && dp[(i-1) % 2][j - eg[i]] != inf && dp[(i-1) % 2][j - eg[i]] + cg[i] < dp[i % 2][j]) 
				dp[i % 2][j] = dp[(i-1) % 2][j - eg[i]] + cg[i];
			dp[i % 2][j] = min(dp[(i-1) % 2][j], dp[i % 2][j]);
		}
	
	min = inf;
	for (i = W; i < 10001; i++)
		if (dp[G % 2][i] != inf)	min = min(min, dp[G % 2][i]);
	printf("%d\n", min);
	return 0;
}