Как записать результаты в массив,я в ступоре.
Доброго времени суток форумчане.Я что то впал в ступор:cray: .
Задача такая,нужно найти все уникальные комбинации в массиве , сумма которых равна искомому числу.Это отлично решается этим кодом.Пример ниже: var A = [15.8, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]; var K = 2; var pr = []; Combination(A, K); function Combination(A, K) { A.sort((a, b) => a - b); let local = []; unique_combination(0, 0, K, local, A); } function unique_combination(l, sum, K, local, A) { if (sum == K) { pr = local; console.log("pr",pr); } for (let i = l; i < A.length; i++) { if (sum + A[i] > K) continue; if (i > l && A[i] == A[i - 1]) continue; local.push(A[i]); unique_combination(i + 1, sum + A[i], K, local, A); local.pop(); } } на выходе получаем уникальные комбинации: pr (4) [0.5, 0.5, 0.5, 0.5] pr (3) [0.5, 0.5, 1] pr (3) [0.5, 0.6, 0.9] pr (3) [0.5, 0.7, 0.8] pr (3) [0.6, 0.6, 0.8] pr (2) [0.8, 1.2] pr (2) [0.9, 1.1] и это круто,но задача состоит в том что бы все эти комбинации развернуть в обратном порядке и записать в новый массив,должно выглядеть так на выходе [[0.5, 0.5, 0.5, 0.5], [1, 0.5, 0.5], [0.9, 0.6, 0.5], [0.8, 0.7, 0.5], [0.8, 0.6, 0.6], [1.2, 0.8], [1.1, 0.9]]. Проблема № 1,я пробовал применить reverse()к localтак pr = local.reverse();,но к моему глубокому удивлению на выходе получаю вот это:blink: : pr (4) [0.5, 0.5, 0.5, 0.5]//верно pr (3) [1, 0.5, 0.5]//верно pr (3) [0.9, 0.6, 1]//не верно!!!!!!! pr (3) [0.8, 0.7, 0.9]//не верно!!!!!!! pr (3) [0.8, 0.6, 0.6]//верно pr (2) [1.2, 0.8]//верно pr (2) [1.1, 0.9]//верно Проблема № 2,как записать все результаты в новый массив:-?,я пробовал push,splice(),но толку 0.В идеале нужен код который соответственно описанного выше примера создаст новую переменную которая будет использоваться далее в которую будет помещён результат [[0.5, 0.5, 0.5, 0.5], [1, 0.5, 0.5], [0.9, 0.6, 0.5], [0.8, 0.7, 0.5], [0.8, 0.6, 0.6], [1.2, 0.8], [1.1, 0.9]],этот результат естественно представлен в виде примера для данных условий . var A и var Kестественно могут применять и другие значения. В общем спасите!, почти сутки борюсь,но результатов нет. |
pingu,
let A = [15.8, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]; let K = 2; let arr = Combination(A, K); function Combination(A, K) { A.sort((a, b) => a - b); let local = [], pr = []; unique_combination(0, 0, K, local, A, pr); return pr } function unique_combination(l, sum, K, local, A, pr) { if (sum == K) { pr.push(local.slice(0)); } for (let i = l; i < A.length; i++) { if (sum + A[i] > K) continue; if (i > l && A[i] == A[i - 1]) continue; local.push(A[i]); unique_combination(i + 1, sum + A[i], K, local, A, pr); local.pop(); } } console.log("arr",arr); |
Цитата:
pr (4)[0.5, 0.5, 0.5, 0.5]//верно pr (3)[1, 0.5, 0.5]//верно pr (3)[0.9, 0.6, 1]//не верно!!!!!!! pr (3)[0.8, 0.7, 0.9]//не верно!!!!!!! pr (3)[0.8, 0.6, 0.6]//верно pr (2)[1.2, 0.8]//верно pr (2)[1.1, 0.9]//верно 3 и 4 комбинации не корректны в моём случае?Должно же быть так pr (3)[0.9, 0.6, 1]//не верно!!!!!!! => [1, 0.9, 0.6] pr (3)[0.8, 0.7, 0.9]//не верно!!!!!!!=>[0.9, 0.8, 0.7]Как это исправить перед записью в массив?Спасибо! |
pingu,
:-? <script> let A = [15.8, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]; let K = 2; let arr = Combination(A, K); function Combination(A, K) { A.sort((a, b) => a - b); let local = [], pr = []; unique_combination(0, 0, K, local, A, pr); return pr } function unique_combination(l, sum, K, local, A, pr) { if (sum == K) { pr.push(local.slice(0).sort((a, b) => b - a)); } for (let i = l; i < A.length; i++) { if (sum + A[i] > K) continue; if (i > l && A[i] == A[i - 1]) continue; local.push(A[i]); unique_combination(i + 1, sum + A[i], K, local, A, pr); local.pop(); } } document.write(`<pre>${JSON.stringify(arr)}</pre>`); </script> |
Цитата:
|
Часовой пояс GMT +3, время: 22:29. |