Pagini recente » Cod sursa (job #2131273) | Cod sursa (job #2590829) | Cod sursa (job #2067677) | Cod sursa (job #2370502) | Cod sursa (job #3001140)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream in("ruksak.in");
ofstream out("ruksak.out");
const int nmax = 300000;
int dp[nmax + 1];
struct elem
{
int gr,pr;
};
elem v[nmax + 1];
vector<elem>optim;
int N,G;
bool cmp(elem a, elem b)
{
if(a.gr > b.gr)
return true;
if(a.gr == b.gr)
if(a.pr > b.pr)
return true;
return false;
}
int main()
{
in>>N>>G;
int pr0 = 0;
for(int i = 1; i <= N; i++)
in>>v[i].gr>>v[i].pr;
sort(v + 1, v + N + 1, cmp);
int j = 1;
for(int i = 1; i <= N; i++)//scapam de elem inutile
{
if(v[i].gr == 0)
pr0 += v[i].gr;
else if(v[i].gr == v[j].gr && G/v[i].gr >= (i - j + 1))//cate elem cu aceasta greutate incap
optim.push_back(v[i]);//incap mai multe decat am pus deja
else if(v[i].gr != v[j].gr && G/v[i].gr >= (i - j + 1))
{
j = i;
optim.push_back(v[i]);
}
}
int k = optim.size();
for(int i = 0; i < k; i++)
for(int j = G; j >= 0; j--)
if(dp[j + optim[i].gr] < dp[j] + optim[i].pr)
dp[j + optim[i].gr] = dp[j] + optim[i].pr;
out<<dp[G] + pr0;
return 0;
}