Cod sursa(job #412858)

Utilizator avram_florinavram florin constantin avram_florin Data 6 martie 2010 19:38:21
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#include<algorithm>
#define MAXN 5010

const int x = 9999999;
using namespace std;
ifstream f ("energii.in");
ofstream g ("energii.out");

int G,W,sol,dp[MAXN];
typedef struct{
			int g,c;
			}generator;
generator v[1001];

void read_data()
{
	int i;
	f >> G >> W;
	for(i = 1 ; i <= G ; i++)
		f >> v[i].g >> v[i].c;
}

void solve()
{
	int i , j,gmax , gm ;
	dp[0] = 1;
	sol = x;
	gmax = 1;
	for( i = 1 ; i <= G ; i++ )
		{
			gm = gmax;
			for(j = gmax ; j >= 0 ; j--)
				{
					if(j == 0)
						{
							if(v[i].g >= W && v[i].c < sol)
								sol = v[i].c;
								else
								if(dp[v[i].g] > v[i].c || dp[v[i].g] == 0)
									{
										dp[v[i].g] = v[i].c;
										if(v[i].g > gm)
											gm = v[i].g;
									}
						}
					else
					{
						if( j + v[i].g >= W && dp[j] + v[i].c < sol)
							sol = dp[j]+ v[i].c;
							else
							if(dp[j+v[i].g] > dp[j] + v[i].c || dp[j+v[i].g] == 0)
								{
									dp[j+v[i].g] = dp[j] + v[i].c;
									if(j + v[i].g > gm)
										gm = j + v[i].g;
								}
					}
				}
			gmax = gm;
		}
}

void print()
{
	if(sol!=x)
		g << sol << '\n';
		else
		g << "-1\n";
}

int main (void)
{
	read_data();
	solve();
	print();
	return 0;
}