Фрагмент кода ниже показывает, что я имею в виду под ситом. Это простое решение, и, вероятно, бесполезное для большого ввода. Это не то же самое, что сита, чтобы найти простые числа, которые содержат только истину или ложь, но больше похоже на словарь комбинаций и их сумму, например:
{value: 14, components: [4, 10]}
Если вы не знакомы с Javascript, массивы ведут себя больше как ассоциативные массивы или словари со строковыми ключами (поэтому необходимо преобразование Number
), и for in
выполняет итерации только по элементам, имеющим значение, если массив редкий Также slice
и concat
создают копию массива.
function minSub(array, target) {
var sieve = [[]];
for (var i in array) {
var temp = [];
for (var j in sieve) {
var val = Number(j) + array[i];
if (!sieve[val] || sieve[val].length > sieve[j].length + 1) {
temp[val] = sieve[j].concat([array[i]]);
}
}
for (var j in temp) {
if (Number(j) <= target) {
sieve[j] = temp[j].slice();
}
}
}
var max = 0;
for (var j in sieve) {
if (Number(j) > max) {
max = Number(j);
}
}
return sieve[max];
}
console.log(minSub([4, 10, 14], 14));
console.log(minSub([0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0], 8));
Обратите внимание, что, вопреки тому, что я предложил в комментарии, сортировка ввода в порядке убывания не гарантирует, что самая простая комбинация для формирования значения будет найдена первой; вам нужно проверять количество компонентов всякий раз, когда вы встречаете значение, уже присутствующее в сите; например с вводом:
{8, 4, 3, 2, 1}
Вы найдете комбинацию:
{value: 9, components: [4, 3, 2]}
до нахождения:
{value: 9, components: [8, 1]}