Другие языки программирования и технологии

С++ сумма комбинаций

Есть комбинация чисел
1 2 3 4 5 6 7 8 9 10
надо вывести все комбинации, которые дают число 14, но выводятся лишние значения (повторяющиеся), то есть
10 1
5 6
....
1 10
6 5
как с циклом не играл, всегда одна вариация лишняя
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
using namespace std;
int main() {
const auto n = 10;
auto m = n;
int v[n];
for (auto i = 0; i != m; ++i) v[i] = i + 1;
for (auto i : v) cout << i << ' ';
cout << "\nvalue: ";
auto sum = accumulate(begin(v), end(v), 0);
int value;
cin >> value;
if (value > sum) cout << "Not found!\n";
else if (value == sum) cout << value << endl;
else {
set<vector<int>> comb;
if (value < m) m = value;
vector<int> tmp;
int temp;
do {
for (auto i = 0; i != m; ++i) {
tmp.emplace_back(v[i]);
if (i > 0 && tmp.front() > tmp.back()) break;
if (i > 0) temp = accumulate(tmp.begin(), tmp.end(), 0);
else temp = v[0];
if (temp > value) break;
if (value == temp) {
sort(tmp.begin(), tmp.end());
comb.insert(tmp);
break;
}
}
tmp.clear();
tmp.shrink_to_fit();
} while (next_permutation(v, v + m));
for (auto vec : comb) {
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
cout.put('\n');
}
}
cin.ignore();
cin.get();
}
Андрей =)
Андрей =)
67 395
Лучший ответ
Андрей =) Чтобы долго не ждать, компилировать в Release x64
Эээ.. если исходить из текущего варианта задания (тут _ВОЗМОЖНО (?)_ есть чуть юмора)....

К слову. Даже если у Вас набор чисел другой - всегда можно свести к такому решению. Даже чуть лучше =)
Отсечь повторяющиеся числа в наборе не проблема. Тут уж как фантазия разыграется. Хотите unique, отобрав числа меньше заданного ( http://www.cplusplus.com/reference/algorithm/unique/ ), хотите - "вручную" (опять-же вариантов несколько)
Бортовский Владимир Ок. ок. Чуть серьезнее С утречка с кофе =)

Обратите внимание, что если встречается (или не встречается) пара одинаковых слагаемых н-р 7 + 7 для 14 - ситуация корректно отрабатывается. Ну и т. к. над set shuffle не провести, а новый массив ради этого неохота и странно было-бы - почему-бы и не вложенный цикл =)
Бортовский Владимир Оговорка ^_^
С++ с утречка С кофе =)

Похожие вопросы