确定您是否可以使用每种面额仅使用一次和最多k个硬币进行N种面额的更改

时间:2016-01-19 21:09:24

标签: algorithm dynamic-programming knapsack-problem coin-change

这是变币问题的一个版本。因此,这是一个动态编程问题。

我知道如果您可以使用每种面额最多一枚硬币,或者如果您最多可以使用k个硬币,而不是两者都可以,那么如何确定是否可以进行更改。

2 个答案:

答案 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 }