, , , ( ). .
std::vector<int> find(const std::vector<int>& numbers, int sum)
{
std::vector<int> result;
if (findNumbersMakingSum(numbers, sum, result, 0)) {
return result;
} else {
return std::vector<int>();
}
}
bool findNumbersMakingSum(
const std::vector<int>& numbers,
int sumLeft,
std::vector<int>& takenNumbers,
size_t position)
{
if (!sumLeft) {
return true;
}
if (position == numbers.size()) {
return false;
}
int current = numbers[position];
if (!current) {
return findNumbersMakingSum(numbers, sumLeft, takenNumbers, position + 1);
}
std::vector<int> taken = takenNumbers;
taken.push_back(current);
if (findNumbersMakingSum(numbers, sumLeft - current, taken, position + 1)) {
takenNumbers = std::move(taken);
return true;
}
return findNumbersMakingSum(numbers, sumLeft, takenNumbers, position + 1);
}
, - . , , , .