Вход

Просмотр полной версии : Перестановки и разделение массива


Pavel_Meridian
26.03.2020, 19:31
Дан массив A, и нужно понять можно массив разделить на две части, кажый из которых равен 10 -и или нет.

Например в случае

A = [-2, 5, 5, 3, 2, 7]

Мы можем иметь эти две подмассивы [-2, 7, 5] и [5, 3, 2] сумма каждой из которых равен 10.

Нужно написать функцию которая получает массив и возвращает true или false в зависимости от того разделение массива возможен или нет.

function permutDevide(){}

console.log(permutDevide([-2, 5, 5, 3, 2, 7])) // true
console.log(permutDevide([10, 5, 5])) // true
console.log(permutDevide([5, 3, 2, -1])) // false
console.log(permutDevide([7, 1, 3, 5, 2, 2])) // true
console.log(permutDevide([1, 1, 10, 1, 1, 6])) // true

Поможете решить задачу?

caetus
27.03.2020, 13:38
const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

alert(!(array1.reduce(reducer) % 10));

рони
27.03.2020, 14:12
caetus,
как разделить массив на равные суммы?

ksa
27.03.2020, 15:33
Как вариант...
Для начала сформировать множество всех перестановок того массива...
Потом каждый элемент этого множества проверять, может ли он быть представлен в виде "одинаковой суммы" с 1-го до i-того и с i+1-го до конца.

Но количество перестановок N элементного множества равно N! :D
A = [-2, 5, 5, 3, 2, 7]
Количество перестановок 720.

ksa
27.03.2020, 15:36
Вот пример создания множества всех перестановок N-элементного множества...
https://habr.com/ru/post/276937/

ksa
27.03.2020, 15:40
Вот еще варианты...
https://askdev.ru/q/perestanovki-v-javascript-21569/
https://ru.stackoverflow.com/questions/138717/Комбинаторика-перестановка-на-javascript

рони
27.03.2020, 18:36
Pavel_Meridian,
<script>
function permute(arr) {
var l = arr.length,
used = Array(l),
data = Array(l);
return function* backtracking(pos) {
if(pos == l) yield data.slice();
else for(var i=0; i<l; ++i) if(!used[i]) {
used[i] = true;
data[pos] = arr[i];
yield* backtracking(pos+1);
used[i] = false;
}
}(0);
}
function permutDevide(arr)
{
if(arr.reduce((a, b) => a - b, 20)) return false;
const gen = permute(arr);
let current = gen.next();
while(!current.done) {
let temp = [], num = 0;
const res = [temp];
for(const elem of current.value) {
temp.push(elem);
num += elem;
if(num == 10) {temp = [], res.push(temp)}
}
if(res.length == 2) return res;
current = gen.next();
}
return false
}
const test = [[-2, 5, 5, 3, 2, 7], [10, 5, 5], [5, 3, 2, -1],
[7, 1, 3, 5, 2, 2], [1, 1, 10, 1, 1, 6], [8, 7, 5], [90, 10, -80]];
for(const arr of test) document.write(`${JSON.stringify(arr)} => ${JSON.stringify(permutDevide(arr))}<br>`)

</script>

Pavel_Meridian
28.03.2020, 00:34
Большое спасибо