假设数组在1 2 3 4 5
这里N = 5
,我们必须选择 3 个元素,我们不能选择超过 2 个连续的元素,所以P = 3
和k = 2
。所以这里的输出将是1 + 2 + 4 = 7
.
我想出了一个递归解决方案,但它的时间复杂度是指数级的。这是代码。
#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 算法(如果存在),或者一种更快的算法。
我尝试了各种测试用例并得到了正确的答案。如果您发现某些测试用例给出了不正确的响应,请也指出这一点。