Я думаю, вы можете сделать это, построив массив длины n с каждым местом в массиве, представляющим количество способов выбора элементов, если это место было выбрано первым. (Выбор слева направо.)
псевдопользователей код (непроверенные):
int[] list = new int[n];
int total = 0;
for(int position = n-1; position >= 0; position--)
{
list[position] = 1;
for(int subPos = position + 2; subPos < n; subPos++)
{
list[position] += list[subPos];
}
total += list[position];
}
Объяснение:
Значение в list[i]
когда закончит работу представляет собой число способов выбора элементов из строка с элементом i, являющимся левым большинством элементов, которые выбраны.
Очевидно, что существует только один способ выбора предметов, так что самый правый элемент - это самый левый элемент, который выбран. Если n = 5, то выбор может быть представлен следующим образом: 00001
Аналогичным образом, для второго самого правильного предмета существует только один способ выбрать элементы, такие как левый самый элемент: 00010
.
Для третьего наиболее подходящего элемента есть один способ выбрать его, где вы выбираете этот предмет, тогда вы должны добавить количество способов выбора каждого из предметов, которые могут быть выбраны вторым (это то, что второй цикл для). Таким образом, этот пункт будет иметь: 00100
и 00101
.
Четвертый наиболее правный товар: 01000
, 01010
, 01001
.
Fith самый правый элемент (первый элемент слева): 10000
, 10100
, , 10010
, 10001
.
Таким образом, массив для п = 5 будет в конечном итоге с этими значениями: {5,3,2,1,1}
И общее бы тогда: 5 + 3 + 2 + 1 + 1 = 12
Если это ваш ответ, вы также можете принять его. – MvG