@Evelate

Как выполнить проверку всех возможных вариантов?

Добрый день,

Есть столбцы, которые могут расшириться, но думаю не более пяти.
Строки будут увеличиваться постоянно.
Значения будут всегда разными.

Например:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

Каждую строку надо сравнить с результатом (обозначим: "счёт"), но по особому.

Хочу, чтобы программа учла все возможные варианты.
Например сначала сравнить каждый столбец с "счёт",
потом столбы 1 2, 1 3, 1 4, 1 5, 1 6, 1 7, 1 8, 1 9, 1 10 с "счёт"
2 1, 2 3, 2 4, 2 5, 2 6, 2 7, 2 8, 2 9, 2 10 с "счёт"
...
1 2 3, 1 2 4, 1 2 5, 1 2 6, 1 2 7, 1 2 8, 1 2 9, 1 2 10 с "счёт"
1 3 2, 1 3 4, 1 3 5, 1 3 6, 1 3 7, 1 3 8, 1 3 9, 1 3 10 с "счёт"
и так вплоть до
1 2 3 4 5 6 7 8 9 10 с "счёт"

Каждый возможный вариант, я потом должен сохранить результат сравнения, Например (истина/ложь)

Далее результат всех возможных вариантов каждой строки, хочу сравнить и выловить самый лучший вариант, подходящий к результату "счёт"
Дабы потом к этим столбцам поставить одно самое эффективное условие)

Так вот, суть вопроса, посоветуйте, как мне в автоматическом режиме проверить все возможные комбинации проверки?
(в ручную делать с помощью множества конструкций if ((1) && (2) && (3) === счёт) все возможные варианты, крайне не благодарное дело. Не могу придумать алгоритм, как лучше использовать циклы((
По любому есть более простой элегантный способ проверки с менее объемом строк кода, но не придумаю как)
  • Вопрос задан
  • 244 просмотра
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Кажется, вам подойдёт такой простой алгоритм: перебрать все числа в двоичной записи от 1 до 2n, и брать те элементы строки, которым соответствует 1.

Набросал функцию, подбирающую из данных элементов комбинацию, дающую наиболее близкую сумму к заданной:
function nearest(arr, total) {
  var len = arr.length
    , i
    , bit
    , sum
    , n = Math.pow(2, len)
    , currDist
    , index = undefined
    , dist = undefined
    , result = []
  ;
  
  for( i = 1; i < n; i++) {
    sum = 0;
    for( bit = 0; bit < len; bit++) {
      if( i & (1 << bit)) sum += arr[bit];
    }
    
    currDist = Math.abs(total - sum);
    if( typeof dist === 'undefined' || dist > currDist) {
      index = i;
      dist = currDist;
      if( dist === 0) break;
    }
  }
  
  for(bit = 0; bit < len; bit++) {
    if( index & (1 << bit)) result.push(arr[bit]);
  }
  
  return result;  
}

nearest([1,3,4,6,8], 12) // [1,3,8]
nearest([1,2,4,6,8], 12) // [2,4,6]
nearest([7,9,13,19,28], 12) // [13] dist = 1
nearest([7,9,13,19,28], 28) // [9,19] не [28] т.к. останавливается на первом найденном варианте
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы