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

Помогите, пожалуйста, решить задачу на языке C++

В магазине продается мастика в ящиках по 15 кг, 17 кг, 21 кг. Как купить ровно 185 кг мастики, не вскрывая ящики? Сколькими способами можно это сделать?
#include <iostream>
using namespace std;
int main() {
const auto s = 185, x15 = 15, x17 = 17, x21 = 21;
const auto n = s / 2;
for (auto i = 0; i <= n; ++i) {
const auto m = s - i * x15;
const auto k = m / x17;
for (auto j = 0; j <= k; ++j) {
const auto g = m - j * x17;
if (0 == g % x21) {
for (auto v = 0; v < i; ++v) cout << x15 << ' ';
for (auto v = 0; v < j; ++v) cout << x17 << ' ';
const auto t = g / x21;
for (auto v = 0; v < t; ++v) cout << x21 << ' ';
cout.put('\n');
}
}
}
system("pause");
}
ВГ
Высокомерная Гламурная Тварь*
67 085
Лучший ответ
Bahtik Dovranov У Вас код короче. Хорошо. И считает быстро.
У меня считает где - то больше часа.
Используя версию кода, что я выложил на Яндекс. Диск https://yadi.sk/d/CyXY94JA3RYNtE комбинации у меня те же выходят, что и у Вас только долго.
Bahtik Dovranov На данный момент три комбинации нашла моя программа и они совпали с Вашими.
Я поправил и перелазил код. Теперь сразу пишет выражения, не ждёт полного исследования всех возможных сочетаний.

#include < iostream >
#include < string >
#include < vector >
#include < sstream >

using namespace std;

int main()
{
setlocale(LC_ALL, "rus");
system("color 0A");
vector < int > dig;
dig.push_back(15);
dig.push_back(17);
dig.push_back(21);
dig.push_back(0);
auto Summ = [](int tt1, int tt2) -> int {return tt1 + tt2; };
cout << "Подходящие выражения" << endl;
unsigned sum_ = 0, sum_all = 0;
for (unsigned a = 0; a < 4; ++a)
{
for (unsigned b = 0; b < 4; ++b)
{
for (unsigned c = 0; c < 4; ++c)
{
for (unsigned d = 0; d < 4; ++d)
{
for (unsigned e = 0; e < 4; ++e)
{
for (unsigned f = 0; f < 4; ++f)
{
for (unsigned g = 0; g < 4; ++g)
{
for (unsigned h = 0; h < 4; ++h)
{
for (unsigned i = 0; i < 4; ++i)
{
for (unsigned j = 0; j < 4; ++j)
{
for (unsigned k = 0; k < 4; ++k)
{
for (unsigned o = 0; o < 4; ++o)
{
for (unsigned p = 0; p < 4; ++p)
{
stringstream ss;
ss << dig[a];
ss << "+";
ss << dig[b];
ss << "+";
ss << dig[c];
ss << "+";
ss << dig[d];
ss << "+";
ss << dig[e];
ss << "+";
ss << dig[f];
ss << "+";
ss << dig[g];
ss << "+";
ss << dig[h];
ss << "+";
ss << dig[i];
ss << "+";
ss << dig[j];
ss << "+";
ss << dig[k];
ss << "+";
ss << dig[o];
ss << "+";
ss << dig[p];
string str;
ss >> str;

stringstream ss1(str);
int f;
ss1 >> f;
ss1.clear();
for (; ss1.rdbuf()->in_avail() != 0;)
{
int te;
char opp;
ss1 >> opp >> te;
f = Summ(f, te);
}
if (f == 185)
{
cout << str << " = 185" << endl;
++sum_;
}
++sum_all;
}
}
}
}
}
}
}
}
}
}
}
}
}

cout << "Итого из " << sum_all << " возможных комбинаций, только " << sum_ << " дало в результате вычислений 185" << endl;
cout << "Что составляет " << 100 * (float)sum_ / sum_all << "%" << endl;
cin.get(); cin.get();
return 0;
}
Сергей Салтыков Как сделать, чтобы комбинации не повторялись?
Например чтобы не было 1 + 3 + 2 и 2 + 3 + 1 и т. д., если есть до этого комбинация 1 + 2 + 3.
Сергей Салтыков Вот. Сделал чтобы без повторений было. Выложил код на Яндекс. Диск.
https://yadi.sk/d/CyXY94JA3RYNtE