Я попытался запустить ваш код, затем студия Visaul отправила мне «IndexOutofBoundsException»,
я не очень хорошо понял ваш код, но, думаю, ваша идея реализации, возможно, не верна.
Эта проблема не является проблемой динамического программирования.
Пусть Cn будет результатом с целевым числом n, если n = 5, а входной список равен {1, 2, 3}, мы можем получить уравнение коллеги:
C5 = C1 x C4 + C2 x C3 + C3 x C2 (1)
Если n = 6, уравнение будет:
C6 = C1 x C5 + C2 x C4 + C3 x C3 (2)
Здесь «x» действует как кросс-произведение, например, мы можем легко вычислить C1 и C2:
C1 = {{1}}
C2 = {{1, 1}, {2}}
Таким образом
C1 x C2 = {{1, 1, 1}, {1, 2}}
А «+» означает объединение, например:
C2 x C3 + C3 x C2 = C2 x C3
Потому что C2 x C3 = C3 X C2
Для реализации мы можем создать класс, переопределяющий операторы "x" и "+":
class Combination
{
List<List<int>> combination;
public override bool Equals(Object obj) {...};
public Combination operator* (Combination c1, Combination c2) {...};
public Combination operator+ (Combination c1, Combination c2) {...};
}
Обратите внимание, что в уравнении (1) содержатся повторяющиеся комбинации C2 и C3, чтобы ускорить выполнение программы, мы можем использовать хэш-набор для сохранения всех вычисленных комбинаций (например, закрытого списка):
HashSet<Combination> calculatedCombinations = new HashSet<Combination>(){};
Теперь мы должны сделать еще один трюк, обратите внимание, что:
C2 = {{1, 1}, {2}} (3)
Но это можно записать как:
C2 = {{2}, {1, 1}} (4)
Поэтому, когда мы переопределяем Equals (), что-то должно быть сделано для обработки (3) и (4), я считаю, что нужно преобразовать C2 в плоский и упорядоченный массив, создать вспомогательную функцию:
private int[] convertCombination(Combination c) {...};
затем convertCombination (C2) = {1, 1, 2}, который является уникальной формой, так что внутренняя часть Equals () может использовать эту функцию для хранения объектов. Надеюсь, что это полезно для вас.
Att: Если у входного списка есть номер, который больше целевого числа, то этот номер следует игнорировать при обходе списка.