Я предполагаю, что такой алгоритм уже существует.
У меня есть два (или больше, но для этой проблемы достаточно двух) ограничений, например limit_a = 20 limit_b = 18. Затем у меня есть несколько пар (a, b), например
(5, 5), (3, 3), (4, 2), (1, 7), (3, 2), (5 , 9), (7, 4)
Ответ должен быть 5. Пример решения: (7, 4), (3, 2), (1, 7), (4, 2) , (3, 3)
Мне нужно выбрать как можно больше пар, чтобы сумма всех элементов «a» была меньше или равна limit_a и аналогично «b». Я думал, что это проблема 2D-рюкзака, но это не так. Мое лучшее «решение» - проверить все перестановки в списке этих пар и проверить суммы. Это нормально, например, как выше, но, конечно, не с большим. Мой код C ++:
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
int main()
{
int limit_a = 20;
int limit_b = 18;
vector<pair<int, int>> vect;
vect.push_back(make_pair(5, 5));
vect.push_back(make_pair(3, 3));
vect.push_back(make_pair(4, 2));
vect.push_back(make_pair(1, 7));
vect.push_back(make_pair(3, 2));
vect.push_back(make_pair(5, 9));
vect.push_back(make_pair(7, 4));
int how_many_max = 0;
do {
int copy_a = limit_a;
int copy_b = limit_b;
int how_many = 0;
for ( vector<pair<int,int>>::const_iterator it = vect.begin(); it != vect.end(); it++){
copy_a -= it->first;
copy_b -= it->second;
if((copy_a < 0) || (copy_b < 0)) {
break;
}
how_many++;
}
if (how_many > how_many_max) how_many_max = how_many;
} while(next_permutation(vect.begin(), vect.end() ));
cout << how_many_max;
return 0;
}
Пример:
int limit_a = 30;
int limit_b = 80;
std::vector<std::pair<int, int>> vect = {{37, 20}, {90, 45}, {76, 33}, {3, 93}, {66, 71}, {48, 21}, {8, 28}, {24, 83}, {99, 13}, {42, 52}, {81, 15}, {2, 38}, {7, 19}, {32, 65}, {70, 85}, {12, 82}, {61, 6}, {60, 31}, {46, 34}, {43, 62}, {41, 78}, {64, 80}, {88, 86}, {77, 16}, {44, 100}, {92, 57}, {40, 53}, {9, 56}, {68, 67}, {23, 11}, {35, 30}, {69, 84}, {75, 27}, {87, 26}, {50, 36}, {79, 73}, {4, 91}, {17, 98}, {51, 29}, {25, 95}, {14, 55}, {10, 58}, {54, 49}, {97, 63}, {59, 72}, {1, 39}, {18, 22}, {94, 74}, {96, 5}, {47, 89}
Должен дать 3
: ({2, 38}, {7, 19}, {18, 22})