Pagini recente » Cod sursa (job #2267682) | Cod sursa (job #1093880) | Cod sursa (job #2626921) | Cod sursa (job #138715) | Cod sursa (job #3163674)
#include <fstream>
using namespace std;
ifstream cin("rucsac.in");
ofstream cout("rucsac.out");
int n,G,sol;
int g[10001],p[10001];
int l,dp[3][5002];
int main()
{
/**
dp[i][g]=profitul maxim pe care il putem obtine luand o submultime din primele i elemente cu greutatate g
dp[i][g]={ - 0 i=0 sau g=0
{ -max(dp[i-1][g],d[i-1][g-Gi]+p[i]
ori nu adaugam elementul i si dp[i][g]=dp[i-1][g]
ori adaugam elementul i dp[i][g]=d[i-1][g-Gi]+p[i]
Gi=greutatea elementului i si p[i]=profitul elementului i
observam ca noi calculam cu ajutorul liniei precedente =>avem nevoie doar de doua linii
**/
cin>>n>>G;
for(int i=1;i<=n;i++)
cin>>g[i]>>p[i];
l=0;
for(int i=1;i<=n;i++)
{
l=1-l;
for(int j=0;j<=G;j++)
{
dp[l][j]=dp[1-l][j];
if(0<=j-g[i])
dp[l][j]=max(dp[l][j],dp[1-l][j-g[i]]+p[i]);
}
}
cout<<dp[n%2][G];
return 0;
}