Предположим, что массив равен 1 2 3 4 5
Здесь N = 5
и нам нужно выбрать 3 элемента, и мы не можем выбрать более 2 последовательных элементов, поэтому P = 3
и k = 2
. Таким образом, выход будет 1 + 2 + 4 = 7
.Найти минимальную сумму элементов «P» в массиве из N элементов, так что не более чем «k» последовательных элементов выбраны вместе
Я придумал рекурсивное решение, но оно имеет экспоненциальную временную сложность. Вот код.
#include<iostream>
using namespace std;
void mincost_hoarding (int *arr, int max_size, int P, int k, int iter, int& min_val, int sum_sofar, int orig_k)
{
if (P == 0)
{
if (sum_sofar < min_val)
min_val = sum_sofar;
return;
}
if (iter == max_size)
return;
if (k!=0)
{
mincost_hoarding (arr, max_size, P - 1, k - 1, iter + 1, min_val, sum_sofar + arr[iter], orig_k);
mincost_hoarding (arr, max_size, P, orig_k, iter + 1, min_val, sum_sofar, orig_k);
}
else
{
mincost_hoarding (arr, max_size, P, orig_k, iter + 1, min_val, sum_sofar, orig_k);
}
}
int main()
{
int a[] = {10, 5, 13, 8, 2, 11, 6, 4};
int N = sizeof(a)/sizeof(a[0]);
int P = 2;
int k = 1;
int min_val = INT_MAX;
mincost_hoarding (a, N, P, k, 0, min_val, 0, k);
cout<<min_val;
}
Кроме того, если предположительно элементы P не могут быть выбраны после ограничения, то мы возвращаем INT_MAX.
Мне задали этот вопрос в интервью. Предложив это решение, интервьюер ожидал чего-то более быстрого. Возможно, подход DP к проблеме. Может ли кто-то предложить алгоритм DP, если он существует, или более быстрый алгоритм.
Я пробовал различные тесты и получил правильные ответы. Если вы найдете некоторые тестовые примеры, которые дают неверный ответ, укажите это тоже.
Если массив {1,2,3,4,5,6} и Р = 4, к = 3, то может быть выбран 1,2,4,5 ? –
Нет, тогда 1, 2, 3, 5 следует выбрать. Вы можете выбрать не более трех последовательных элементов вместе, когда k = 3. – user2560730
Предложение: избегайте в вашем примере использовать отсортированный массив, он «вводит в заблуждение» (а в случае отсортированного массива решение тривиально). – Jarod42