Как и со многими проблемами, решение становится гораздо проще найти/исследовать, когда известна какая-либо терминология.
Решения этих проблем известны как Integer композиций, которые в перспективе обобщение разбиений (где порядок не имеет значения, то есть только ответы, которые являются уникальными в соответствии с перестановкой считаются).
Например, целочисленные перегородки 4 являются: 1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 3, 2 + 2, 4, тогда как целое число композиции 4 являются : 1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 1 + 3, 3 + 1, 2 + 2, 4.
Существует несколько вариантов реализации легко доступны (ссылки на алгоритмы языка агностика следующим образом):
- Поскольку вы работаете в R, the
partitions
package может генерировать разделы для йа и. Вам нужно будет найти уникальные перестановки для каждого раздела, чтобы получить композиции (см. this SO question).
- Если вы можете использовать другой язык (либо взаимодействуя с R, либо предварительно вычитая ответ), то Mathematica выполняет функцию: Compositions:
Compositions
.
- Sage является бесплатным (в отличие от Mathematica), а также имеет функцию генерации композиций, построенных в:
Compositions
. Стоит отметить, что этот реализован с использованием generators, который может использовать память более эффективно.
- Python: см. this Вопрос переполнения стека (который генерирует разделы, которые вы затем можете переставить). Я сделал что-то подобное here (хотя он использует
itertools
, чтобы найти перестановки, которые затем мне нужно отфильтровать для уникальных перестановок, поэтому это можно было бы сделать более эффективно, используя алгоритм перестановки специально для multisets).
Для того, чтобы понять алгоритмов лучше (или реализовать их самостоятельно), вы могли бы проверить эту неполную, но полезную книгу: Combinatorial Generation по Frank Ruskey, который показывает, как создавать разделы в постоянная амортизационного времени (CAT). Поскольку вы хотите создавать композиции, вы также можете использовать алгоритм CAT для генерации перестановок (также в книге) для генерации перестановок каждого целочисленного раздела.
RusKey также объясняет, как ранг и unrank их, что может быть удобно для хранения/хэширования результаты.
Я считаю, что они также красиво покрыты в Knuth's Art of Computer Programming Volume 4A, если вам это удобно.
ElKamina's suggestion to solve it recursively является хорошим, но я бы не использовал этот подход для больших H; начиная с R (as well as Python) doesn't optimise tail-calls, вы можете завершить переполнение стека.
Разве это не решение того, что вы опубликовали уникальным? ('x_1 = 4',' x_2 = x_3 = x_4 = 0') – Shahbaz
Если вы не дадите нам уравнение, мы не сможем решить его. – Thomash
Я предполагаю, что помимо ваших значений, являющихся целыми числами, вы также ограничиваете их положительными целыми числами?И я также предполагаю, что четыре уравнения на самом деле являются независимыми, а не решаются вместе ... – Chris