Pagini recente » Cod sursa (job #245919) | Cod sursa (job #2677467) | Cod sursa (job #416178) | Cod sursa (job #2497512) | Cod sursa (job #2972589)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
#include <string.h>
using namespace std;
// ifstream cin("input");ofstream cout("output");
ifstream cin("rucsac.in");ofstream cout("rucsac.out");
vector<int> dp; // dp[i] = cel mai mare profit al unei submultimi cu suma greutatilor egala cu i
vector<int> greutate, pret;
/*
Dp dupa obiectul 3 7 :
0 0 0 7 7 7 7 7 7 7 7
Dp dupa obiectul 3 4 :
0 0 0 7 7 7 11 11 11 11 11
Dp dupa obiectul 1 2 :
0 2 2 7 9 9 11 13 13 13 13
Dp dupa obiectul 1 9 :
0 9 11 11 16 18 18 20 22 22 22
Dp dupa obiectul 2 4 :
0 9 11 13 16 18 20 22 22 24 26
Dp dupa obiectul 1 5 :
0 9 14 16 18 21 23 25 27 27 29
*/
int main() {
int n, g;
cin>>n>>g;
dp.resize(g+1, 0);
greutate.resize(n);
pret.resize(n);
for (int i=0; i<n; i++){
cin>>greutate[i]>>pret[i];
}
// dp[i] si vreau sa pun un obiect cu greutate[j] si pret[j] -> dp[i+greutate[j]] = dp[i] + pret[j]
/*
// ASA NU - PENTRU CA IAU UN OBIECT DE MAI MULTE ORI
for (int i=1; i<=g; i++){ // greutatea submultimii
for (int j=0; j<n; j++){ // obiecte
if (i-greutate[j] < 0)
continue;
dp[i] = max(dp[i] , dp[i-greutate[j]] + pret[j]);
}
}
*/
for (int j=0; j<n; j++){ // obiecte
for (int i=g; i>=greutate[j]; i--){ // greutatea submultimii
dp[i] = max(dp[i] , dp[i-greutate[j]] + pret[j]);
}
/*
// afisare partiala
cout<<"Dp dupa obiectul "<<greutate[j]<<" "<<pret[j]<<" :\n";
for (int i=0; i<=g; i++){
cout<<dp[i]<<" ";
}
cout<<'\n';
cout<<'\n';
*/
}
int raspuns = 0;
for (int i=1; i<=g; i++){
raspuns = max(raspuns, dp[i]);
}
cout<<raspuns<<'\n';
}