Pagini recente » Cod sursa (job #268069) | Cod sursa (job #1786057) | Cod sursa (job #1322235) | Cod sursa (job #763967) | Cod sursa (job #3165414)
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
ifstream fin("energii.in");
ofstream fout("energii.out");
int dp[10001];///retine profiturile maxime pt fiecare greutate ce poate fi obtinuta din suma greutatilor el bagate in rucsac
int e[10001];
int main()
{
int n,G,p,q,min1=INT_MAX;
fin>>n>>G;
for(int i=1;i<=10000;i++){
dp[i]=-1; /// dp[i]!=-1 s-a obtinut submultimea de suma a greutatilor =i , profitul este dp[i]
e[i]=0;
}
int k=0;
for(int i=1;i<=n;i++){
fin>>q>>p; /// am citit un nou obiect
for(int j=G;j>=0;j--){
if(dp[j]!=-1){ /// s-a obtinut anterior submultimea de suma a greutatilor j, obiectul de greutate g si profit p va fi adaugat si obtinem o submultime de suma j+g si profit dp[j]+p
if(dp[j+q]<dp[j]+p){ /// profitul submiltimei de suma j+g e mai mic decat profitul dp[j]+p
dp[j+q]=dp[j]+p;
e[j+q]= e[j]+q;
k=max(j+q,k);
}
}
}
}
/// determin maximul din dp
for(int i=1;i<=k;i++){
if(dp[i]<min1 && e[i]>=G){
min1=dp[i];
}
}
if(min1==INT_MAX){
fout<<-1;
}else{
fout<<min1;
}
return 0;
}