Равный гибрид подмножеств суммы

Вы можете указать путь к вашему проекту или решению между «build» и --configuration. Установка его примерно таким образом должна решить вашу проблему:

$(Build.SourcesDirectory)/path/toCSProjOrSln.sln

$(Build.SourcesDirectory) будут напрямую заменены на что-либо ранее, чтобы вы знали, что находитесь в корне своего репо. Более подробная информация о предопределенных переменных и о dotnet core cli

7
задан Dan D. 20 July 2011 в 17:35
поделиться

4 ответа

Без проблем, вот O(1) решение.

A1 = {}; 
A2 = {};
sum(A1) == sum(A2) /* == 0 */

ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ.


Серьезно, одна оптимизация, которую можно сделать (предполагающий, что мы говорим о положительных числах) должна только проверить подмножества меньше или равный sum(A)/2.

Для каждого элемента в A существует три опции, который делает его O(3^N):

  1. Вставьте его A1
  2. Вставьте его A2
  3. Отбросьте его

Вот наивное решение в Perl (который считает соответствия, у Вас может быть ранний возврат, если Вы просто хотите протестировать существование).

use List::Util qw/sum/;

my $max = sum(@ARGV)/2;
my $first = shift(@ARGV); # make sure we don't find the empty set (all joking aside) and that we don't cover same solution twice (since elements are unique)
my $found = find($first,0, @ARGV);
print "Number of matches: $found\n";

sub find {
    my ($a, $b, @tail) = @_;
    my $ret = $a == $b? 1 : 0; # are a and b equal sub-sets?
    return $ret unless @tail;

    my $x = shift @tail;
    $ret += find($a + $x, $b, @tail) if $a + $x <= $max; # put x in a
    $ret += find($a, $b + $x, @tail) if $b + $x <= $max; # put x in b
    return $ret + find($a, $b, @tail); # discard x
}
3
ответ дан 7 December 2019 в 10:08
поделиться

Если ответ не, то сумма всех n чисел, по крайней мере, 2^n-1. Таким образом, если n является большим, и числа являются 32-разрядными целыми числами, например, то ответ - почти всегда да. Если n является маленьким, Вы можете, вероятно, "в лоб".

Самый твердый случай, вероятно, когда n - приблизительно 30.

2
ответ дан 7 December 2019 в 10:08
поделиться

Я думаю, что можно решить его точно так же, как проблема суммы подмножества. Возьмите булеву функцию Q (я, s), который верен, если a0, a1..., ай имеют подмножество, которое суммирует к s и содержит ай. Можно вычислить его для всего я и s, использующий динамическое программирование (это - стандартный подход). Затем можно просканировать все значения Q для s, который имеет больше чем одно истинное значение в его связанной строке.

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

1
ответ дан 7 December 2019 в 10:08
поделиться

Эта проблема, кажется, по крайней мере, так же трудна как СУММА ПОДМНОЖЕСТВА. Если мы можем найти два подмножества A: B = {b1..., BP} и C = {c1..., уравнение} таким образом, что b1 +... +bp =-c1-с... уравнениями, или если мы решаем, что ни один не существует, затем мы решили СУММУ ПОДМНОЖЕСТВА (A) (игнорирование тривиального регистра где 0 ∈ A).

Я не уверен, что Вы подразумеваете под ним, не обязательно для B и C покрыть A, таким образом, проблема автоматически не уменьшается до проблемы суммы подмножества. Проверьте определение СУММЫ ПОДМНОЖЕСТВА.

0
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: