Pagini recente » Cod sursa (job #958833) | Cod sursa (job #1290702) | Cod sursa (job #2624324) | Cod sursa (job #1777936) | Cod sursa (job #2115664)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
ifstream fin("file.in");
ofstream fout("file.out");
struct set
{
int w, p, poz;
};
vector<set> arr;
vector<set> coada;
int n, g;
set aux;
bool cmp(set a, set b)
{
float x = a.w, y = b.w;
return (a.p / x) < (b.p / y);
}
int main()
{
fin >> n >> g;
for (int i = 0; i < n; i++)
{
fin >> aux.w >> aux.p;
aux.poz = i + 1;
arr.push_back(aux);
}
sort(arr.begin(), arr.end(), cmp);
coada.push_back(arr[n - 1]);
int sum = arr[n - 1].p;
int weg = arr[n - 1].w;
int i = n - 2;
int poz = i;
int cont = 0;
while(i >= 0){
//cout << "all: " << arr[i].poz << "\n";
if(weg + arr[i].w <= g){
//cout << "yes: " << arr[i].poz << "\n";
coada.push_back(arr[i]);
sum = sum + arr[i].p;
weg = weg + arr[i].w;
cont++;
poz = i;
//cout << "sum: " << sum << " weg: " << weg << "\n";
}
i--;
}
int j = cont;
int suma;
int gr;
for(int i = poz - 1; i >= 0; i--){
suma = sum;
gr = weg;
while(j>=0){
if(gr - coada[j].w + arr[i].w <= g ){
if(suma - coada[j].p + arr[i].p > sum){
sum = suma - coada[j].p + arr[i].p;
weg = gr - coada[j].w + arr[i].w;
}
j--;
}
}
}
/*
for (int i = 0; i < n; i++){
cout << arr[i].w << " " << arr[i].p << "\n";
}*/
cout << sum << "\n";
/*
for (int i = 0; i < n; i++){
cout << arr[i].w << " " << arr[i].p << "\n";
}
*/
return 0;
}