def bottom_up_coin_change(amount, denoms, denoms_length):
    """

    Parameters
    ----------
    amount : int
        Target amount
    denoms : list<int>
        denominations
    denoms_length : int
        number of unique denominations

    Returns
    -------
    int
        count of ways

    >>> bottom_up_coin_change(10, [25, 10, 5, 1], 4)
    4
    """

    cache = [[0 for _ in range(amount + 1)] for _ in range(denoms_length + 1)]

    for i in range(denoms_length + 1):
        cache[i][0] = 1

    for denom_index in range(1, denoms_length + 1):
        denom = denoms[denom_index - 1]
        for amount in range(1, amount + 1):
            if denom <= amount:
                cache[denom_index][amount] = cache[denom_index][amount - denom] + cache[denom_index - 1][amount]

    return cache[denoms_length][amount]