TheAlgorithms/Python · error · ValueError

Each integral piece of rod must have a corresponding price.

Error message

Each integral piece of rod must have a corresponding price. Got n = {n} but length of prices = {len(prices)}

What it means

Raised by the rod-cutting argument checker when n exceeds len(prices). Every integral piece length 1..n needs a price entry, so prices must have at least n items (index 0 is the price of a length-1 piece, etc.). Otherwise the algorithms would read past the end of the price list.

Source

Thrown at dynamic_programming/rod_cutting.py:197

    Basic checks on the arguments to the rod-cutting algorithms

    * `n`: int, the length of the rod
    * `prices`: list, the price list for each piece of rod.

    Throws ``ValueError``:
        if `n` is negative or there are fewer items in the price list than the length of
        the rod
    """
    if n < 0:
        msg = f"n must be greater than or equal to 0. Got n = {n}"
        raise ValueError(msg)

    if n > len(prices):
        msg = (
            "Each integral piece of rod must have a corresponding price. "
            f"Got n = {n} but length of prices = {len(prices)}"
        )
        raise ValueError(msg)


def main():
    prices = [6, 10, 12, 15, 20, 23]
    n = len(prices)

    # the best revenue comes from cutting the rod into 6 pieces, each
    # of length 1 resulting in a revenue of 6 * 6 = 36.
    expected_max_revenue = 36

    max_rev_top_down = top_down_cut_rod(n, prices)
    max_rev_bottom_up = bottom_up_cut_rod(n, prices)
    max_rev_naive = naive_cut_rod_recursive(n, prices)

    assert expected_max_revenue == max_rev_top_down
    assert max_rev_top_down == max_rev_bottom_up
    assert max_rev_bottom_up == max_rev_naive

View on GitHub (pinned to f5988cc097)

Solutions

  1. Ensure len(prices) >= n; extend the price list or reduce n.
  2. Double-check argument order — the signature is (n, prices), not (prices, n).
  3. If prices come from a file, validate the row length matches the maximum rod length before calling.

Example fix

# before
top_down_cut_rod(7, [6, 10, 12, 15, 20, 23])  # ValueError

# after
prices = [6, 10, 12, 15, 20, 23, 25]
top_down_cut_rod(7, prices)
Defensive patterns

Strategy: validation

Validate before calling

def valid_rod_args(n: int, prices: list[float]) -> bool:
    return n >= 0 and len(prices) >= n

Try / catch

try:
    top_down_cut_rod(n, prices)
except ValueError as e:
    if 'corresponding price' in str(e):
        n = min(n, len(prices))
    else:
        raise

Prevention

When it happens

Trigger: Calling top_down_cut_rod(7, [6, 10, 12, 15, 20, 23]) (n=7 > 6 prices), or bottom_up_cut_rod with n derived from a different list than prices. Equality n == len(prices) is fine.

Common situations: Appending to a rod-length request without extending the price table; using a truncated price list (e.g. CSV row missing columns); mixing up argument order so a longer list lands in n's position.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/9e40d13bb2559392. Report an issue: GitHub.