Pagini recente » Cod sursa (job #1131872) | Istoria paginii runda/concurs_11_12_02_26 | Cod sursa (job #1459166) | Cod sursa (job #1318373) | Cod sursa (job #2551145)
#include <fstream>
#include <algorithm>
#include <vector>
#define MAX 300000
#define MAX_GREUTATE 3000
using namespace std;
struct rucsac
{
int w;
int p;
}v[MAX + 1];
vector< rucsac >ales;
int dp[MAX_GREUTATE + 1];
bool cmp(rucsac a, rucsac b)
{
if(a.w < b.w)return true;
if(a.w == b.w && a.p > b.p)return true;
return false;
}
int main()
{
int n, g;
ifstream fin("ruksak.in");
ofstream fout("ruksak.out");
fin >> n >> g;
for(int i = 1; i <= n; i++)
fin >> v[i].w >> v[i].p;
sort(v + 1, v + n + 1, cmp);
int cnt = 0, limita = 0;
for(int i = 1; i <= n; i++)
{
if(v[i].w != v[i - 1].w)
{
cnt = 0;
limita = g / v[i].w;
}
if(cnt < limita)
{
cnt++;
ales.push_back(v[i]);
}
}
int maxPret = -1;
for(auto x : ales)
for(int i = g - x.w; i >= 0; i--)
if(dp[i + x.w] < dp[i] + x.p)
{
dp[i + x.w] = dp[i] + x.p;
maxPret = max(maxPret, dp[i + x.w]);
}
fout << maxPret;
fin.close();
fout.close();
return 0;
}