Учитывая список чисел, найдите подмножество, которое суммируется с любым числом в диапазоне чисел

99
8

Как я могу сделать метод, возвращающий true или false, когда задан массив положительных или отрицательных целых чисел и значение k, так что некоторые числа в этом массиве суммируются до любого числа от 1 до k.

Например, заданный массив [-10, 20,14, -3] и k = 6, это вернет true как 14+ (-10) = 4, который находится между 1 и 6.

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

Благодарю!

спросил(а) 2013-11-12T00:45:00+04:00 6 лет, 11 месяцев назад
1
Решение
99

Я думаю, что путь состоит в том, чтобы сортировать числа, затем суммировать меньший и меньший список, пока он не будет работать

Вот ответ в scala

def sumit(x : List[Int], k: Int ): List[Int] = x match { case x  => if(x.sum > k ) x else sumit(x.init, k)

The List must be presorted, ie call like this
val numbers=List(-9, 1, 3, 6, 5, 1, 2)
sumit( numbers.sorted.reverse, 16)

и в perl

#!/usr/bin/perl
#

sub any_adds_to {
my $target=shift;
my $list=shift;
my @sorted=sort {$a <=> $b} @$list;
my $v=0;
for (@sorted) {
$v=$v+$_;
last if $v>$target;
}
return $v>$target;
}

sub assert {
$_[0] ? "OK\n" : "FAIL\n";
}

my %test_as_false=(18=>[3,2,4,2,6],
255=>[32,33,34,35,35],
1200=>[-1,1000,1,199]);
for my $val_to_find (keys %test_as_false) {
print assert(not(any_adds_to($val_to_find, $test_as_false{$val_to_find})));
}

my %test_as_correct=(18,[2,4,6,8],
255,[65,66,67,68],
1200=>[1,1000,1,199]);

for my $val_to_find (keys %test_as_correct) {
print assert((any_adds_to($val_to_find, $test_as_correct{$val_to_find})));
}

ответил(а) 2013-11-12T01:03:00+04:00 6 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема