动态编程:找到所有成员的乘积等于给定数的子集

时间:2015-02-16 09:16:33

标签: algorithm dynamic-programming

我会找到解决此问题的算法。

  

输入:n个整数数组和数字k

     

我们必须从数组中找到一组数字,所有这些数字在set中的乘积等于k是

我认为,我必须使用动态编程来完成这项任务。但我不知道如何使用它。

1 个答案:

答案 0 :(得分:5)

这类似于子集和问题,您需要找到sum为值k的子集。

因为你的问题有一个解决方案(你有一个子集S,乘法是k)当且仅当你有一个集合中每个x的log(x)的子集时, sum是log(k)(相同的子集,每个元素都有log),问题几乎完全相同。

然而,通常使用的DP解决方案对于总和是非常有效的,因为元素的总和不会最终变大,而乘法则相反。你也不能对所有元素采取log并且"使用它",因为数字不是整数 - 并且对子集和的DP解决方案需要整数才能工作。

但是,您可以使用Top-Down DP (memoization)部分解决此问题。这很简单,完成如下:

existenceOfSubset(set, product, map):
    if (product== 1):
           return true
    if (set.isEmpty()):
           return false
    if (map.containsKey(product)):
           return map.get(product)
    first = set.getFirst()
    set = set.removeFirst()
    solution = existenceOfSubset(set,product,map) OR (product%first == 0?existenceOfSubset(set,product/first,map):false) //recursive step for two possibilities
    map.put(product,solution  //memoize
    set.addFirst(first) //clean up
    return solution

使用existenceOfSubset(set,product,new HashMap())

进行调用