Cod sursa(job #2502095)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 30 noiembrie 2019 13:02:31
Problema Energii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
long long n,emin,energie[1005],cost[1005],dp[10003],suma,minim,dp1[10003];
int main () {
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	scanf("%lld%lld", &n, &emin);
	for(int i=1;i<=n;++i)
		scanf("%lld%lld", &energie[i], &cost[i]),suma+=energie[i];
	if(suma<emin) {
		printf("-1");
		return 0;
	}
	dp[energie[1]]=cost[1];
	for(int i=2;i<=n;++i) {
		for(int j=10001;j-energie[i]>=0;--j)
			if(dp[j-energie[i]]!=0) {
				if(dp[j]!=0)
					dp1[j]=min(dp[j],dp[j-energie[i]]+cost[i]);
				else
					dp1[j]=dp[j-energie[i]]+cost[i];
			}
		for(int j=0;j<=10001;++j)
			if(dp1[j]!=0)
				dp[j]=dp1[j],dp1[j]=0;
		if(dp[energie[i]]==0)
			dp[energie[i]]=cost[i];
		else
			dp[energie[i]]=min(cost[i],dp[energie[i]]);
	}
	minim=1e9;
	for(int i=emin;i<=10001;++i)
		if(dp[i]!=0)
			minim=min(minim,dp[i]);
	printf("%lld", minim);
	return 0;
}
//de la dreapta ;la stanga;