28.01.2022, 17:10
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
Разбить массив на подмассивы
Добрый день , прошу помощи . Как составить цикл, чтобы разбить массив на подмассивы .
Дано arr= [1,2,4,7,1,6,2,8]
Нужно получить arr_new=[[8,2],[6,4],[1,2,7,1]]
T.e разбить массив , на подмассивы , чтобы сумма в подмассивах как можно ближе была равна 10 .
Если нужны мои потуги кода , я могу выложить , но пока своим умом дойти не могу.
Заранее, спасибо.
|
|
28.01.2022, 23:45
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
Спасибо за ссылку , буду искать.
|
|
29.01.2022, 00:07
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от DzonyB
|
Если нужны мои потуги
|
аналогично что - то из разряда ... слеплено из ... )))
<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>
|
|
29.01.2022, 01:16
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
Еще раз спасибо , когда копирую Ваш код к себе в браузер , выдает кучу ошибок . Буду пробовать сам .
|
|
29.01.2022, 15:09
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
Ничего не получается , мож поможете составить цикл , только по одному моему массиву , а не по группе , как в предложенном ранее варианте.
Заранее спасибо.
P.S хоть и не получается , но плюсы небольшие есть. Перелопатил всю книгу. ))
|
|
29.01.2022, 15:13
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от DzonyB
|
мож поможете составить цикл , только по одному моему массиву ,
|
permutDevide([1,2,4,7,1,6,2,8], 10);
|
|
29.01.2022, 15:35
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
Сообщение от рони
|
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)
Поэтому и попросил помощи . Вы в своем коде разберетесь быстрее чем , но если нет , так нет . Все равно спасибо.
|
|
29.01.2022, 15:40
|
Интересующийся
|
|
Регистрация: 28.01.2022
Сообщений: 16
|
|
P.S Я работаю в HTML и использую Vue . Может в этом проблема ?
|
|
29.01.2022, 16:15
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
DzonyB,
не понимаю.
|
|
|
|