确定您是否可以使用每种面额仅使用一次且最多使用 k 个硬币以 N 面额进行找零

lar*_*ars 1 algorithm knapsack-problem dynamic-programming coin-change

这是硬币兑换问题的一个版本。因此,这是一个动态规划问题。

我知道如何确定您是否可以找零,如果您最多可以使用每种面额的一枚硬币,或者您最多可以使用 k 枚硬币,但不能同时使用两者。

use*_*ica 5

组合约束相当简单。我们可以构建一个三维表,其维度表示允许的最大硬币数、允许的硬币数量和目标总和,或者我们可以说“搞砸”并在简单的递归解决方案之上抛出记忆。在 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)
Run Code Online (Sandbox Code Playgroud)