我有一个整数数组,给出了数字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);
答案 0 :(得分:0)
这肯定是一个动态编程问题,但是它有一些技巧。
您需要建立的是一个表,您可以到达的产品,您在第一次达到该值时所需的最后一个因子的位置。 (换句话说,如果你找到两种方法来达到一个值,你想要坚持使用第一种方法。)你用动态编程来构建这个表。
在[2, 2, 5, 5, 7]
的示例中,0
到4
的位置表格如下:
{
1: -1,
2: 0,
4: 1,
5: 2,
10: 2,
20: 2,
50: 3,
100: 3,
7: 4,
14: 4,
28: 4,
35: 4,
70: 4,
140: 4,
350: 4,
700: 4
}
现在,您在表格中搜索以找到最接近的值。这是28
。
现在你倒退了这些因素。 28
位于4
的{{1}}位置7
。除以此,您在位置4
1
2
2
。除以这一点,你在位置0
的{{1}}就是2.最后,当你开始时,你有1
。 (空产品总是1。)
此解决方案几乎有效。问题是你的表通常会变得非常大,几乎完全填满了太大的值。给定整数约束,您应该跟踪到达的最小绝对值,该绝对值大于目标答案的绝对值。在这种情况下,这将使你的表保持这个:
{
1: -1,
2: 0,
4: 1,
5: 2,
10: 2,
20: 2,
50: 3,
7: 4,
14: 4,
28: 4,
35: 4
}
这里没有这么大的胜利。但是对于较大的套装,这将提供显着的改进。