#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <class InputIt, typename T, typename F1, typename F2>
InputIt greedy_knapsack(InputIt first, InputIt last, const T& b, F1 price, F2 weight)
{
using Item = typename InputIt::value_type;
T init(0);
std::sort(first, last, [&](Item& i1, Item& i2) {
if (price(i1) == price(i2)) return weight(i1) < weight(i2);
if (weight(i1) == weight(i2)) return price(i2) < price(i1);
return weight(i1) * price(i2) < weight(i2) * price(i1);
});
InputIt it = std::find_if(first, last, [&](Item& i) {
return (init += weight(i)) > b;
});
return it;
}
struct my_item
{
int _a; // weight
int _p; //
};
int main(int argc, char const *argv[])
{
std::vector<my_item> v{{4,2}, {10,3}, {20, 4}, {7,2}};
auto it1 = begin(v);
auto it2 = greedy_knapsack(begin(v), end(v), 15,
[](my_item& i)->int { return i._p; },
[](my_item& i)->int { return i._a; }
);
for (; it1 != it2; ++it1) {
cout << '(' << it1->_a << ", " << it1->_p << ')';
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0LCB0eXBlbmFtZSBULCB0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+CklucHV0SXQgZ3JlZWR5X2tuYXBzYWNrKElucHV0SXQgZmlyc3QsIElucHV0SXQgbGFzdCwgY29uc3QgVCYgYiwgRjEgcHJpY2UsIEYyIHdlaWdodCkKewoJdXNpbmcgSXRlbSA9IHR5cGVuYW1lIElucHV0SXQ6OnZhbHVlX3R5cGU7CiAgICBUIGluaXQoMCk7CiAgICBzdGQ6OnNvcnQoZmlyc3QsIGxhc3QsIFsmXShJdGVtJiBpMSwgSXRlbSYgaTIpIHsKICAgIAlpZiAocHJpY2UoaTEpID09IHByaWNlKGkyKSkgcmV0dXJuIHdlaWdodChpMSkgPCB3ZWlnaHQoaTIpOwogICAgCWlmICh3ZWlnaHQoaTEpID09IHdlaWdodChpMikpIHJldHVybiBwcmljZShpMikgPCBwcmljZShpMSk7CiAgICAJcmV0dXJuIHdlaWdodChpMSkgKiBwcmljZShpMikgPCB3ZWlnaHQoaTIpICogcHJpY2UoaTEpOyAKICAgIH0pOwogICAgSW5wdXRJdCBpdCA9IHN0ZDo6ZmluZF9pZihmaXJzdCwgbGFzdCwgWyZdKEl0ZW0mIGkpIHsgCiAgICAJcmV0dXJuIChpbml0ICs9IHdlaWdodChpKSkgPiBiOwogICAgfSk7CiAgICByZXR1cm4gaXQ7Cn0KCnN0cnVjdCBteV9pdGVtCnsKICAgIGludCBfYTsgLy8gd2VpZ2h0CglpbnQgX3A7IC8vIAp9OwoKCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pCnsKCXN0ZDo6dmVjdG9yPG15X2l0ZW0+IHZ7ezQsMn0sIHsxMCwzfSwgezIwLCA0fSwgezcsMn19OwoJYXV0byBpdDEgPSBiZWdpbih2KTsKICAgIGF1dG8gaXQyID0gZ3JlZWR5X2tuYXBzYWNrKGJlZ2luKHYpLCBlbmQodiksIDE1LCAKICAgIAlbXShteV9pdGVtJiBpKS0+aW50IHsgcmV0dXJuIGkuX3A7IH0sCiAgICAJW10obXlfaXRlbSYgaSktPmludCB7IHJldHVybiBpLl9hOyB9CiAgICApOwogICAgZm9yICg7IGl0MSAhPSBpdDI7ICsraXQxKSB7CiAgICAJY291dCA8PCAnKCcgPDwgaXQxLT5fYSA8PCAiLCAiIDw8IGl0MS0+X3AgPDwgJyknOwogICAgfQoJcmV0dXJuIDA7Cn0=