【发布时间】:2016-03-15 12:46:27
【问题描述】:
我有一个整数数组,并且给出了一个数字 K,我需要找到最接近 K 的值(也是数组的元素),这可以通过将数组中的各种数字相乘来生成。
例如。 arr - 2、2、5、5、7 K = 30
输出 - 2*2*7 = 28。
我想不出任何比指数解决方案更好的解决方案,我对元素进行不同的排列并检查最接近的值。请提出一种更好的(可能是动态编程)方法来有效地解决它。
这是我写的:-
void findClosestValue(int arr[], int start, int end, int k, int& diff, int mul)
{
if(start<=end+1)
{
cout<<" start = "<<start<<" end = "<<end<<" diff = "<<diff<<" k = "<<k<<" mul = "<<mul<<endl;
if(diff > differ(k, mul))
diff = differ(k, mul);
findClosestValue(arr, start+1, end, k, diff, mul*arr[start]);
findClosestValue(arr, start+1, end, k, diff, mul);
}
else
return;
}
调用这个函数是:-
int val = 100000000;
findClosestValue(arr, 0, size-1, k, val, 1);
【问题讨论】:
-
你应该提供你的工作细节(在代码中),然后有人可能会开始讨论如何改进它。
-
我会给出提示的。您正在决定数字参与生成 K 的过程。每个数字都标记为 0 或 1,排列无关紧要。完整的搜索空间是 2^N,N 长度的数组。如果数组必须包含自然数,你可以从中暗示 2*2 必须小于 2*2*7,并且必须大于 2。这是家庭作业问题,你应该努力自己解决。
-
@Mai 您的提示与微不足道的指数解决方案有何不同?
-
取对数可以看出它等价于子集和问题,因此是NP难的。
-
这绝对是 NP 难的。可能有一个伪多项式解决方案,就像子集总和一样。
标签: algorithm dynamic-programming