Разбить массив на подмассивы
Добрый день , прошу помощи . Как составить цикл, чтобы разбить массив на подмассивы .
Дано arr= [1,2,4,7,1,6,2,8] Нужно получить arr_new=[[8,2],[6,4],[1,2,7,1]] T.e разбить массив , на подмассивы , чтобы сумма в подмассивах как можно ближе была равна 10 . Если нужны мои потуги кода , я могу выложить , но пока своим умом дойти не могу. Заранее, спасибо. :( |
DzonyB,
для медитации ... решения не 100% https://javascript.ru/forum/misc/797...e-massiva.html надо искать тем с десяток наберётся. |
Цитата:
|
Цитата:
<script> function permute(arr) { let l = arr.length, used = Array(l), data = Array(l); return function* backtracking(pos) { if (pos == l) yield data.slice(); else for (let i = 0; i < l; ++i) if (!used[i]) { used[i] = true; data[pos] = arr[i]; yield* backtracking(pos + 1); used[i] = false; } }(0); } function sumArray(arr) { return arr.reduce((a, b) => a + b, 0) } function permutDevide(arr, n) { arr.sort((a, b) => a - b); const gen = permute(arr); let current = gen.next(); let max = [], k = 0, sum = sumArray(arr); while (!current.done) { let temp = [], num = 0, d = 0, s = sum; const res = [temp]; for (const elem of current.value) { if(num + elem > n && s != elem || (elem > n)) { if(num == n) d++; temp = [elem]; res.push(temp); num = elem; } else { temp.push(elem); num += elem; } s -= elem; } if(num == n) d++; if (!temp.length) res.pop(); if (d >= sum / n - 1.5) return res; if (!max.length) max = res; if (d > k) { max = res; k = d }; current = gen.next(); } return max } const test = [ [1, 2, 4, 7, 1, 6, 2, 8], [5, 2, 5, 1, 5, 4, 6, 3], [100, 8, 7, 3, 1, 45, 20, 6, 4], [2, 2, 3, 9, 5, 6, 1], [3, 3, 3, 3, 3, 3], [3, 7, 3, 3, 3, 3] ]; for (const arr of test) document.write(`${JSON.stringify(arr)} => ${JSON.stringify(permutDevide(arr, 10))}<br>`) </script> |
Еще раз спасибо , когда копирую Ваш код к себе в браузер , выдает кучу ошибок . Буду пробовать сам .
|
Ничего не получается , мож поможете составить цикл , только по одному моему массиву , а не по группе , как в предложенном ранее варианте.
Заранее спасибо. P.S хоть и не получается , но плюсы небольшие есть. Перелопатил всю книгу. :))) |
Цитата:
permutDevide([1,2,4,7,1,6,2,8], 10); |
Цитата:
Мне не нужна Ваша функция function permut(arr){ } Я вчера писал , что при копировании этой функции в PHP Storm и браузере ругается на строку if (pos == l) yield data.slice();. а без этой функции вторая не работает . Пробовал переделать но пока не получилось . Пробую сам , тоже пока результат 0 . И я не очень понял эту часть кода while (!current.done) Поэтому и попросил помощи . Вы в своем коде разберетесь быстрее чем , но если нет , так нет . Все равно спасибо. |
P.S Я работаю в HTML и использую Vue . Может в этом проблема ?
|
DzonyB,
не понимаю. |
Часовой пояс GMT +3, время: 16:59. |