这是变币问题的一个版本。因此,这是一个动态编程问题。
我知道如果您可以使用每种面额最多一枚硬币,或者如果您最多可以使用k个硬币,而不是两者都可以,那么如何确定是否可以进行更改。
答案 0 :(得分:4)
组合约束非常简单。我们可以建立一个三维表格,其中的尺寸代表允许的最大硬币,允许的硬币数量和目标总和,或者我们可以说“#34;拧紧它”#34;并在一个简单的递归解决方案之上抛出memoization。在Python中:
# Assume we have a memoization decorator.
# functools.lru_cache(maxsize=None) would do.
@memoize
def knapsack_possible(coin_tuple, target, k):
if not target:
# Target achieved.
return True
elif not coin_tuple or not k:
# Out of coins.
return False
else:
return (knapsack_possible(coin_tuple[:-1], target, k) or
knapsack_possible(coin_tuple[:-1], target-coin_list[-1], k-1)
答案 1 :(得分:0)
不会与N个面额相同,但添加另一个最终检查以确保N< = k?
changeWithN(amt,k){ ... 返回n< = k? n:-1 }