数组中最接近的乘法值

时间:2016-03-15 12:46:27

标签: algorithm dynamic-programming

我有一个整数数组,给出了数字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);

1 个答案:

答案 0 :(得分:0)

这肯定是一个动态编程问题,但是它有一些技巧。

您需要建立的是一个表,您可以到达的产品,您在第一次达到该值时所需的最后一个因子的位置。 (换句话说,如果你找到两种方法来达到一个值,你想要坚持使用第一种方法。)你用动态编程来构建这个表。

[2, 2, 5, 5, 7]的示例中,04的位置表格如下:

{
    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
}

这里没有这么大的胜利。但是对于较大的套装,这将提供显着的改进。