Вы можете сгенерировать их рекурсивно, добавив от 0 до apples_left
яблок в текущее ведро и вернув все решения для текущего ведра + оставшиеся ведра с apples_left
минус яблоки, взятые для этого ведра. Я думаю, что код объясняет это лучше всего здесь, поэтому вот код Python:
def allocations(apples, baskets):
if baskets == 0:
if apples == 0:
yield []
return
for a in xrange(apples+1):
for alloc in allocations(apples-a, baskets-1):
yield [a] + alloc
for i, alloc in enumerate(allocations(6, 4)):
print 'd%d = %s' % (i+1, ' '.join(map(str, alloc)))
Выходы
d1 = 0 0 0 6
d2 = 0 0 1 5
d3 = 0 0 2 4
d4 = 0 0 3 3
...
d83 = 5 1 0 0
d84 = 6 0 0 0
Полный вывод