Pagini recente » Cod sursa (job #2776865) | Cod sursa (job #1630983) | Cod sursa (job #1533185) | Cod sursa (job #662296) | Cod sursa (job #3254972)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("rucsac.in");
ofstream cout("rucsac.out");
struct ceva
{
int valoare, greutate;
bool operator<(const ceva& temp) const
{
return (valoare/(float)greutate) > (temp.valoare/(float)temp.greutate);
}
};
int n, greutateMaxima;
vector<ceva> v;
vector<int> sumePart;
vector<bool> luat;
int sol = -1;
bool iesi(int poz, int greutateCurenta, int valoareCurenta)
{
if(greutateCurenta > greutateMaxima)
return true;
if(poz == n)
{
sol = max(sol, valoareCurenta);
return true;
}
if(valoareCurenta + sumePart[n] - sumePart[poz] <= sol)
return true;
return false;
}
void bkt(int poz, int greutateCurenta, int valoareCurenta)
{
if(iesi(poz, greutateCurenta, valoareCurenta))
return;
bkt(poz+1, greutateCurenta, valoareCurenta);
bkt(poz+1, greutateCurenta + v[poz+1].greutate, valoareCurenta + v[poz+1].valoare);
}
int main()
{
cin >> n >> greutateMaxima;
v.resize(n+1);
sumePart.resize(n+1);
for(int i = 1;i<=n;i++) cin >> v[i].greutate >> v[i].valoare;
sort(v.begin() + 1, v.begin() + n + 1);
for(int i = 1;i<=n;i++) sumePart[i] += sumePart[i-1] + v[i].valoare;
//cout << "\n\n";
//for(int i = 1;i<=n;i++) cout << v[i].valoare << " "<<v[i].greutate << '\n';
bkt(0, 0, 0);
cout << sol;
}