```typescript
export function splitCents(total: number, weights: number[]): number[] {
  if (!Number.isInteger(total)) throw new Error("total must be whole cents");
  if (total < 0) throw new Error("total may not be negative");
  if (!Array.isArray(weights) || weights.length === 0) throw new Error("weights must be a non-empty list");
  if (!weights.every((w) => Number.isInteger(w) && w > 0)) throw new Error("a weight is a positive whole number");

  const whole = weights.reduce((a, b) => a + b, 0);
  const parts = weights.map((w) => Math.floor((total * w) / whole));
  let remainingCents = total - parts.reduce((a, b) => a + b, 0);

  while (remainingCents > 0) {
    const discardedFrac = parts.map((part, index) => [
      index,
      part / weights[index] - Math.floor(part / weights[index]),
    ]);
    discardedFrac.sort((a, b) => b[1] - a[1]);
    for (const [index] of discardedFrac) {
      if (remainingCents > 0) {
        parts[index]++;
        remainingCents--;
      } else break;
    }
  }

  return parts;
}
```