Сумма значений массива с суммой, равной X - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть целочисленная коллекция. Мне нужно получить все возможные значения, что сумма значений равна X.

Мне нужно что-то вроде это .

Это может быть написано на: delphi, c #, php, RoR, python, cobol, vb, vb.net

Ответы [ 2 ]

5 голосов
/ 27 февраля 2009

Это проблема подмножества сумм . И это NP-Complete .

Единственный способ реализовать это - создать все возможные комбинации и сравнить значения сумм. Хотя методы оптимизации существуют.

Вот один в C #:

static class Program
{
    static int TargetSum = 10;
    static int[] InputData = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    static void Main()
    {
        // find all permutations
        var permutations = Permute(InputData);

        // check each permutation for the sum
        foreach (var item in permutations) {

            if (item.Sum() == TargetSum) {

                Console.Write(string.Join(" + ", item.Select(n => n.ToString()).ToArray()));
                Console.Write(" = " + TargetSum.ToString());
                Console.WriteLine();

            }
        }

        Console.ReadKey();
    }

    static IEnumerable<int[]> Permute(int[] data) { return Permute(data, 0); }

    static IEnumerable<int[]> Permute(int[] data, int level)
    {
        // reached the edge yet? backtrack one step if so.
        if (level >= data.Length) yield break;

        // yield the first #level elements
        yield return data.Take(level + 1).ToArray();

        // permute the remaining elements
        for (int i = level + 1; i < data.Length; i++) {
            var temp = data[level];
            data[level] = data[i];
            data[i] = temp;

            foreach (var item in Permute(data, level + 1))
                yield return item;

            temp = data[i];
            data[i] = data[level];
            data[level] = temp;
        }

    }
}
2 голосов
/ 27 февраля 2009

Динамическое программирование даст наилучшее время выполнения для точного решения. Страница проблемы суммы подмножеств в Википедии содержит псевдокод для алгоритма. По сути, вы заказываете все числа и складываете все возможные последовательности в таком порядке, чтобы минимизировать количество добавлений. Время выполнения псевдополиномиальное.

Для полиномиального алгоритма вы можете использовать Алгоритм аппроксимации . Псевдокод также доступен на странице Проблема суммы подмножеств .

Из двух алгоритмов я бы выбрал динамическое программирование, так как оно простое и хорошо работает с большинством наборов данных.

Однако, если целые числа неотрицательны и соответствуют описанию на странице Википедии, то вы могли бы сделать это за полиномиальное время с помощью алгоритма аппроксимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...