我会找到解决此问题的算法。
输入:n个整数数组和数字k
我们必须从数组中找到一组数字,所有这些数字在set中的乘积等于k是
我认为,我必须使用动态编程来完成这项任务。但我不知道如何使用它。
答案 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())