Cod sursa(job #653853)

Utilizator an_drey_curentandreycurent an_drey_curent Data 29 decembrie 2011 02:15:47
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>
long int energii[1001],costuri[1001],dp[1001][20003];
int main()
{
	long int k,j,i,N,W,min=10000001;
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	scanf("%d",&N);
	scanf("%d",&W);
	for(i=0;i<=1001;i++)
		costuri[i]=-1;
	for(i=1;i<=N;i++)
	{
		scanf("%d",&energii[i]);
		scanf("%d",&costuri[i]);
		dp[i][energii[i]]=costuri[i];
	}
	for(i=2;i<=N;i++)
		for(j=1;j<=10005;j++)
			if(dp[i-1][j]!=0)
			{
				if(dp[i][j]!=0&&dp[i][j]>dp[i-1][j])
					dp[i][j]=dp[i-1][j];
				else
					if(dp[i][j]==0)
						dp[i][j]=dp[i-1][j];
				if(j<W)
					if(dp[i][j+energii[i]]>(dp[i-1][j]+costuri[i])&&dp[i][j+energii[i]]!=0)
						dp[i][j+energii[i]]=dp[i-1][j]+costuri[i];
					else
						if(dp[i][j+energii[i]]==0)
							dp[i][j+energii[i]]=dp[i-1][j]+costuri[i];
			}
	if(W==0)
		printf("0");
	else
	{
	for(j=W;j<=20000;j++)
		if(dp[N][j]!=0)
			if(dp[N][j]<min)
				min=dp[N][j];
	if(min==10000001)
		printf("-1");
	else
		printf("%d",min);
	}
	return 0;
}