Хех, ниасиливает тостер
динамическое программирование.
n = 185
dp = [1] + [0] * n
for cap in 16, 17, 21:
for i in range(n - cap, -1, -1):
for j in range(i + cap, n + 1, cap):
dp[j] += dp[i]
print(dp[n])
UPDATE
Найдите все варианты заказа.
а я только подсчитал их
n = 185
dp = [['']] + [[] for _ in range(n)]
for cap in 16, 17, 21:
for i in range(n - cap, -1, -1):
for seed in dp[i]:
for j in range(i + cap, n + 1, cap):
dp[j].append(f"{(seed + ' + ') if seed else ''}{cap}*{(j - i) // cap}")
print(*dp[n], sep='\n')