Cod sursa(job #652273)

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

int eg[1001], cg[1001], dp[1001][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;
	scanf ("%d %d", &G, &W);
	for (i = 1; i <= G; i++)	scanf ("%d %d", &eg[i], &cg[i]);
	
	for (i = 0; i <= G; 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]);
		}
	
	for (i = W; i < 10001; i++)
		if (dp[G % 2][i] != inf)	{printf("%d", dp[G % 2][i]); return 0;}
	return 0;
}