Cod sursa(job #3254998)

Utilizator AndreasBossGamerBaragau Andreas AndreasBossGamer Data 9 noiembrie 2024 11:11:42
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#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;
}