Я бы подошел к этому так:
Во-первых, обобщите проблему. Вы можете определить функцию
printPartitions(int target, int maxValue, string suffix)
со спецификацией:
Выведите все целочисленные разделы цели, за которыми следует суффикс, так что каждое значение в разделе не больше maxValue
Обратите внимание, что всегда существует по крайней мере 1 решение (при условии, что и target, и maxValue положительны), то есть все 1 с.
Вы можете использовать этот метод рекурсивно. Итак, давайте сначала подумаем о базовом случае:
printPartitions(0, maxValue, suffix)
следует просто напечатать suffix
.
Если target
не 0
, у вас есть варианты: либо использовать maxValue
, либо нет (если maxValue > target
есть только один вариант: не использовать его). Если вы не используете его, вы должны уменьшить maxValue
на 1
.
То есть:
if (maxValue <= target)
printPartitions(target-maxValue, maxValue, maxValue + suffix);
if (maxValue > 1)
printPartitions(target, maxValue-1, suffix);
Объединение всего этого приводит к относительно простому методу (здесь закодировано на Java, и я немного изменил порядок операторов, чтобы получить тот же порядок, который вы описали):
void printPartitions(int target, int maxValue, String suffix) {
if (target == 0)
System.out.println(suffix);
else {
if (maxValue > 1)
printPartitions(target, maxValue-1, suffix);
if (maxValue <= target)
printPartitions(target-maxValue, maxValue, maxValue + " " + suffix);
}
}
Вы можете просто назвать это как
printPartitions(4, 4, "");
который выводит
1 1 1 1
1 1 2
2 2
1 3
4
person
Vincent van der Weele
schedule
18.07.2013