У меня есть функция bool exists(int sum, vector<int>& vec)
Что он делает, это вернуть, есть ли какая-либо последовательность чисел в vec
, которая равна sum
.Вычислить последовательность целых чисел в векторе
например
Vec = 140 80 90 180 70
sum = 300
Функция возвращает true
, поскольку последовательность 140 90 70
существует и равен 300.
На данный момент у меня есть код:
bool possible(int sum, vector<int> &vec)
{
do
{
int s = 0;
for (int i = 0; i < vec.size(); i++)
{
s += vec.at(i);
if (s == sum)
{
return true;
}
}
}while(next_permutation(vec.begin(), vec.end()));
return false;
}
Это работает, но занимает слишком много времени, даже когда размер вектора составляет всего 20.
Может ли кто-нибудь помочь мне с лучшим подходом?
Эта проблема так же сложна, как [подмножество sum] (http://en.wikipedia.org/wiki/Subset_sum_problem). – Pradhan
Как я вижу, задача требует около N! итераций. 20!составляет 2,43 * 10 18, и он не может быть быстрее в общем. –
Возможно, это может помочь. http://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem – shauryachats