```python
def cut_roll(length: int, board: list[tuple[int, int]]) -> dict:
    if length < 0:
        raise ValueError("Length must be a non-negative whole number.")

    dp = [(-1, []) for _ in range(length + 1)]
    dp[0] = (0, [])

    for l in range(1, length + 1):
        max_price = -1
        best_pieces = []
        for metres, price in board:
            if l >= metres and dp[l - metres][0] + price > max_price:
                max_price = dp[l - metres][0] + price
                best_pieces = [metres]
            elif l == metres and dp[l - metres][0] + price == max_price:
                best_pieces.append(metres)
        dp[l] = (max_price, best_pieces)

    return {"takings": dp[length][0], "pieces": dp[length][1]}
```