给定一个大小为 n 的数组。您必须使用 x 中的最小元素数获得一个总和,比如 x 并且该数组中的任何元素都可以无限使用
Given an array of size n. You have to obtain a sum say x using minimum no of elements in x and any element in this array can be used infinitely
有没有最优化的方法来解决这个问题。我有一种在 O(nx) 中解决它的方法,谁能建议我更好的解决方案。
这是一个称为 unbounded knapsack 的问题。这个问题的优化版本是 NP-hard,但是有伪多项式算法可以在 O(nx) 中解决它。
这是 Python 中的示例实现:
def solve(A, x):
T = [float('inf')]*(x+1)
T[0] = 0
for element in A:
for i in xrange(len(T)-element):
T[i+element] = min(T[i+element], T[i]+1)
return T[x]
print solve([5, 2], 10) #2: 5+5 = 10
print solve([5, 2], 8) #4: 2+2+2+2 = 8
此实现只是 returns 最少的元素数。寻找实际元素(单个组合,它们的数量可能呈指数级增长)留作练习。
有没有最优化的方法来解决这个问题。我有一种在 O(nx) 中解决它的方法,谁能建议我更好的解决方案。
这是一个称为 unbounded knapsack 的问题。这个问题的优化版本是 NP-hard,但是有伪多项式算法可以在 O(nx) 中解决它。
这是 Python 中的示例实现:
def solve(A, x):
T = [float('inf')]*(x+1)
T[0] = 0
for element in A:
for i in xrange(len(T)-element):
T[i+element] = min(T[i+element], T[i]+1)
return T[x]
print solve([5, 2], 10) #2: 5+5 = 10
print solve([5, 2], 8) #4: 2+2+2+2 = 8
此实现只是 returns 最少的元素数。寻找实际元素(单个组合,它们的数量可能呈指数级增长)留作练习。