Pagini recente » Cod sursa (job #3170338) | Cod sursa (job #1311578) | Cod sursa (job #1015490) | Cod sursa (job #604268) | Cod sursa (job #3254998)
#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;
int sol = -1;
inline long double bestSuffixProfit(int i, int remaining_weight) {
long double best_profit = 0;
for (int j = i; j <= n && remaining_weight > 0; ++j) {
int aux = min(remaining_weight, v[j].greutate);
remaining_weight -= aux;
best_profit += 1.0 * v[j].valoare * aux / v[j].greutate;
}
return best_profit;
}
bool iesi(int poz, int greutateCurenta, int valoareCurenta)
{
if(greutateCurenta > greutateMaxima)
return true;
if(poz == n)
{
sol = max(sol, valoareCurenta);
return true;
}
if(valoareCurenta + bestSuffixProfit(poz, sol - greutateCurenta) <= 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;
}