Cod sursa(job #124136)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 18 ianuarie 2008 12:45:48
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include "stdio.h"
#define INF 2000000001

FILE *fin=freopen("energii.in","r",stdin);
FILE *fout=freopen("energii.out","w",stdout);

int g,w,x[1001],c[1001],f[1001][5001],min;
void citeste()
{
	scanf("%d%d",&g,&w);
	for(int i=1;i<=g;i++)
	{
		scanf("%d%d",&x[i],&c[i]);
	}
	fclose(fin);
	for (int i = 1; i <= w; i++)
        f[0][i] = INF;
    f[0][0] = 0;
}
void rezolva()
{
	int i,j;
	int imin=0;
	int crt,prev;

	for(i=1;i<=g;i++)
	{
        crt=i; prev=i-1;
		for(j=w;j>=1;j--)
		{
            f[crt][j]=INF;
            if(j==w){
			 if(x[i]<=j && c[i]+f[prev][j-x[i]]<f[prev][j])
			 {
				    f[crt][j]=c[i]+f[prev][j-x[i]]; 
			 }else f[crt][j]=f[prev][j];
            }
			else 
			{
                if(f[prev][j]>f[crt][j+1]) f[crt][j]=f[crt][j+1];
                else f[crt][j]=f[prev][j];
                
                if(x[i]<=j && c[i]+f[prev][j-x[i]]<f[crt][j])
			    {
				    f[crt][j]=c[i]+f[prev][j-x[i]]; 
			    }
            }
		}
	}
}
void afiseaza()
{
    if(f[g][w]!=INF)
	printf("%d",f[g][w]);
	else printf("-1");
	fclose(fout);
}

int main()
{
	citeste();
	rezolva();
	afiseaza();
	return 0;
}