```python
"""Fixed-point money helpers: parse, format, and allocate integer cents."""

import re


def parse_amount(text: str) -> int:
    if not isinstance(text, str):
        raise ValueError("amount must be a string")
    match = re.fullmatch(r"(\d+)(?:\.(\d{2}))?", text)
    if match is None:
        raise ValueError(f"malformed amount: {text}")
    whole = int(match.group(1))
    cents = 0 if match.group(2) is None else int(match.group(2))
    return whole * 100 + cents


def format_amount(cents: int) -> str:
    if isinstance(cents, bool) or not isinstance(cents, int) or cents < 0:
        raise ValueError("cents must be a non-negative integer")
    return f"{cents // 100}.{cents % 100:02d}"


def allocate_cents(total_cents: int, weights: list) -> list:
    if total_cents is None or not isinstance(total_cents, int) or total_cents < 0:
        raise ValueError("total_cents must be a non-negative integer")
    if not isinstance(weights, list) or len(weights) == 0:
        raise ValueError("weights must be a non-empty list of integers")
    if any(w is None or not isinstance(w, int) or w < 0 for w in weights):
        raise ValueError("all weights must be non-negative integers")
    if sum(weights) == 0:
        raise ValueError("sum of weights must be greater than zero")

    exact_shares = [total_cents * weight // sum(weights) for weight in weights]
    remainder = total_cents - sum(exact_shares)

    # Distribute the remainder to shares with the largest remainders
    for i in range(remainder):
        max_remainder_index = max(range(len(weights)), key=lambda j: (weights[j] * total_cents // sum(weights) % weights[j], -j))
        exact_shares[max_remainder_index] += 1

    return exact_shares
```