#algorithm #search #combinations #subset-sum
#алгоритм #Поиск #комбинации #подмножество-сумма
Вопрос:
Как бы вы проверили все возможные комбинации из заданного набора N, R, S чисел, чтобы они складывались в заданное конечное число, где вы можете использовать только 1 число из каждого набора?
Краткий пример:
Набор чисел для добавления:
N = {1,2,3,...}
R = {4,5,6,...}
S = {7,8,9,...}
Желаемый результат: все числа, которые в сумме равны X, поэтому, когда X = 12, результат будет
[1,4,7]
Комментарии:
1. Для каждой пары (n, r), где n r меньше X, проверьте, находится ли X-(n r) в S. Если S индексировано, это должно быть возможно в O (n * n * log n).
2. @SaiBot С хэшем это возможно в
O(n*n)
.
Ответ №1:
Использование JavaScript:
var N=[1,2,3];
var R=[4,5,6];
var S=[7,8,9];
function xInNRS(x) {
return N.forEach(n=>R.forEach(r=>S.forEach(s=>{if(n r s==x) console.log([n,r,s])})));
}
console.log(12);xInNRS(12);
console.log(13);xInNRS(13);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы также можете сохранить все, а затем проверить на x или распечатать x:
var N=[1,2,3];
var R=[4,5,6];
var S=[7,8,9];
var X={};
N.forEach(n=>R.forEach(r=>S.forEach(s=>{
var sum=n r s;
if(X[sum]==undefined) X[sum]=[];
X[sum].push([n,r,s]);
})));
console.log("All Xs");
console.log(X);
console.log("Test x");
console.log(9,X[9]!=undefined);
console.log(16,X[16]!=undefined);
console.log("Combinations for x");
console.log(9,X[9]);
console.log(12,X[12]);
console.log(13,X[13]);
.as-console-wrapper { max-height: 100% !important; top: 0; }