Перечислите все суммы k объектов в наборе из n целых чисел в DES C ORDER - PullRequest
1 голос
/ 19 января 2020

У меня большой набор из n целых чисел. Мне нужно выбрать k элементов в этом списке так, чтобы они суммировались от самого большого до самого маленького. Каждое выбранное подмножество должно быть действительным для некоторого правила (это не имеет значения для правила). Я хочу найти подмножество с наибольшей суммой, которое также допустимо.

Например, используя небольшой набор чисел (10, 7, 5, 3, 0), размер подмножества 3 и простое Правило (сумма должна быть простой), код будет выглядеть следующим образом:

10, 7, 5 = 22 -> NOT PRIME, KEEP GOING
10, 7, 3 = 20 -> NOT PRIME, KEEP GOING
10, 5, 3 = 18 -> NOT PRIME, KEEP GOING
10, 7, 0 = 17 -> PRIME, STOP

Я знаю, что я мог бы просто поместить КАЖДУЮ комбинацию в список, упорядочить ее по убыванию, а затем двигаться вниз, пока сумма не пройдет тест, но это кажется чрезвычайно неэффективным как в пространстве, так и во времени, особенно если у меня есть набор размера, например 100, и размер поднабора 8. Это как 186 миллиардов комбинаций, которые я должен был бы вычислить.

есть способ просто сделать это в простой l oop, где я начинаю с проверки наибольшей суммы на достоверность, а затем вычисляю и go до следующей максимально возможной суммы и проверяю на действительность, et c.? Что-то вроде:

// Assuming set is ordered, this is the largest possible sum given the subset_size
int sum = set.Take(subset_size).Sum();

while (!IsValid(sum))
{
    sum = NextLargest(set, subset_size, sum);
}

bool IsValid (int sum)
{
    return sum % 2 == 0;
}

int NextLargest (int[] set, int subset_size, int current_sum)
{
    // Find the next largest sum here as efficiently as possible
}

1 Ответ

0 голосов
/ 19 января 2020

Вам не нужно смотреть на каждую комбинацию, только на те, которые составляют большее число.

Перебор набора в порядке убывания и проверка суммы. Следите за наибольшей действительной суммой, найденной до сих пор. Когда большая сумма невозможна, вырвитесь из l oop. Например, учитывая размер подмножества 5, вы нашли действительную сумму 53. В какой-то момент вы рассматриваете подмножество, которое начинается с 10. Так как числа расположены в порядке убывания, наибольшая сумма, которую вы можете получить в этой точке, равна 50. этот путь можно оставить. Это должно значительно сократить пространство для вашего решения.

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