动态规划:找到所有成员的乘积等于给定数字的子集
Dynamic programming: find the subset with product of all members is equals to given number
我会找到解决这个问题的算法。
Input: array of n integers and number k
We must find a set of numbers from array, that product of all this numbers in set equals to k is
我想,我必须为这个任务使用动态规划。但是我不知道怎么用。
这类似于子集求和问题,你需要找到一个子集,其求和的值为k
。
因为你的问题有一个解决方案(你有一个子集 S
乘法是 k
)当且仅当你有一个 log(x) 的子集对于每个 x集合,其总和为 log(k)
(相同的子集,每个元素上有 log
),问题几乎相同。
但是,通常使用的 DP 解决方案对于求和非常有效,因为元素的总和不会最终变得很大,而相乘会。您也不能对所有元素采用 log
和 "work with it",因为数字不是整数 - 子集总和的 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())
我会找到解决这个问题的算法。
Input: array of n integers and number k
We must find a set of numbers from array, that product of all this numbers in set equals to k is
我想,我必须为这个任务使用动态规划。但是我不知道怎么用。
这类似于子集求和问题,你需要找到一个子集,其求和的值为k
。
因为你的问题有一个解决方案(你有一个子集 S
乘法是 k
)当且仅当你有一个 log(x) 的子集对于每个 x集合,其总和为 log(k)
(相同的子集,每个元素上有 log
),问题几乎相同。
但是,通常使用的 DP 解决方案对于求和非常有效,因为元素的总和不会最终变得很大,而相乘会。您也不能对所有元素采用 log
和 "work with it",因为数字不是整数 - 子集总和的 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())