Как найти комбинацию из 3 чисел из массива, которая при добавлении равна другому заданному числу - PullRequest
2 голосов
/ 22 марта 2019

У меня есть массив с несколькими числами.Я хочу, чтобы функция возвращала другой массив максимум из 3 чисел из массива, который при сложении равен другому числу.

Это также может быть 1 или 2 числа, но первое число должно быть максимально возможным.

например:

    var array = [1,2,3,4,5,6,7,8,9,10];
    var number: 25;

желаемый выход: [10,10,5]

или

    var array = [1,2,3,4,5,6,7,8,9,10];
    var number: 11;

желаемый выход: [10,1]

Или

    var array = [1,2,3,4,5,6,7,8,9,10];
    var number: 5;

желаемый результат: [5]

Как вы, вероятно, увидите, я создаю небольшое приложение для дартса, которое вычисляет ваши очки.это последняя часть, где мне нужно показать, какая комбинация дротиков может заставить вас достичь ровно 0 независимо от того, сколько дротиков я бросил.

Я могу циклически просматривать свои числа и получать их в массиве, но каккак только комбинация должна иметь меньшее число перед другой, она не может вычислить.Вот код:


// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];

// The number
var output = 167;

// The variable for the end result
var dartsToFinishArr = [];

// Call my function
checkArray();

function checkArray() {
    for (var j = 0; j < finishingNumbers.length; j++) {
        var dartsToFinishArrTotal = 0;
        if (dartsToFinishArr.length > 0) {
            for (n = 0; n < dartsToFinishArr.length; n++) {
                dartsToFinishArrTotal += dartsToFinishArr[n];
            }
        }

        if (output <= 180) {
            if (finishingNumbers[j] + dartsToFinishArrTotal == +($(".matchContainer .matchPlayerContainer .player.playerTurn .playerScore .value").text()) && dartsToFinishArr.length < 3) {
                dartsToFinishArr.push(finishingNumbers[j]);
                return;
            } else if (finishingNumbers[j] + dartsToFinishArrTotal < output && dartsToFinishArr.length < 3) {
                dartsToFinishArr.push(finishingNumbers[j]);
                checkArray();

                return;
            } else if (dartsToFinishArrTotal != output) {
            return;
            }
        }
    }
}

это должно дать мне:

    var dartsToFinishArr = [60, 57, 50]

но это не

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Логика ниже проходит через все комбинации, пока не найдет три числа, которые соответствуют вашему общему количеству. Он также сокращает до трех цифр, если они соответствуют общему количеству.

// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];

// The number
var output = 167;

console.log( findValues( finishingNumbers, output ) );

function findValues ( numbers, desiredTotal ) {
  numbers = numbers.slice(0).sort((a, b)=>b-a) //sort descending
  
  for ( let i = 0; i < numbers.length; i++ ) {
    if ( numbers[ i ] === desiredTotal ) return [ numbers[ i ] ];
    
    // add in the numbers after the previous number at `i`
    for ( let j = i + i; j < numbers.length; j++ ) {
      if ( numbers[ i ] + numbers[ j ] === desiredTotal ) return [ numbers[ i ], numbers[ j ] ];
      
      // add in the numbers after the previous number at `j`
      for ( let k = j + 1; k < numbers.length; k++ ) {
        if ( numbers[ i ] + numbers[ j ] + numbers[ k ] === desiredTotal ) return [ numbers[ i ], numbers[ j ], numbers[ k ] ];
      }
    }
  }
}
0 голосов
/ 22 марта 2019

Вот моя попытка решить вашу проблему в javascript:

// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];

// The number
var output = 167;

// The variable for the end result
var dartsToFinishArr = [];

for (let i = 0; i < finishingNumbers.length; i++) {
  const element1 = finishingNumbers[i];
  if (element1 === output) {
    dartsToFinishArr = [element1];
    return;
  }

  for (let j = 0; j < finishingNumbers.length; j++) {
    const element2 = finishingNumbers[j];
    if (element1 + element2 == output) {
      dartsToFinishArr = [element1, element2];
      return;
    }

    for (let k = 0; k < finishingNumbers.length; k++) {
      const element3 = finishingNumbers[k];
      if (element1 + element2 + element3 === output) {
        dartsToFinishArr = [element1, element2, element3];
        return;
      }
    }
  }
}

Это похоже на довольно типичный случай "как отладить небольшую программу" , и я настоятельно рекомендую прочитать весь пост в блоге, поскольку это значительно улучшит ваши навыки программирования.

Теперь, когда у нас есть рабочее решение, давайте повеселимся! Это решение соответствует вашим требованиям, но вы заметили, что у меня есть 3 вложенных цикла. Это неплохо, но если бы ваши требования изменились, чтобы в вашем решении было любое количество чисел , мой код быстро взорвался бы в беспорядке копирования и вставки. Можем ли мы построить решение, которое учитывает количество чисел в решении и всегда сможет рассчитать его? Вы держите пари! Это идеальный сценарий для рекурсии .

Вот более сложное, но более общее решение вашей проблемы:

// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];

// The number
var output = 167;

// The variable for the end result
var dartsToFinishArr = [];

// The maximum amount of numbers allowed in the solution;
const maxNumbers = 3;

function sum(total, element) {
  return total + element;
}

function recursiveSolution(possibleSolution) {
  for (let element of finishingNumbers) {

    // Special case when we haven't added anything to the solution yet
    var total = element;
    if (possibleSolution.length > 0) {
      total = possibleSolution.reduce(sum) + element;
    }

    if (total === output) {
      dartsToFinishArr = possibleSolution;
      dartsToFinishArr.push(element);

      //Solution found, return recursively.
      return true;
    }

    if (total < output && possibleSolution.length < maxNumbers - 1) {
      //There's room for more numbers, continue recursively
      const newPossibleSolution = possibleSolution.slice(0);
      newPossibleSolution.push(element);
      if (recursiveSolution(newPossibleSolution)) {
        //The recursion worked, return recursively.
        return true;
      }
    }
  }

  //We tried everything with the current possible solution. Let's backtrack one number and try the next one.
  return false;
}

// Start the recursion with an empty solution
recursiveSolution([]);

console.debug(dartsToFinishArr);

Теперь вы можете изменять maxNumbers и получать любое решение, какое захотите!

0 голосов
/ 22 марта 2019

Привет . Я попытался решить ее, и у меня есть этот код, который работает нормально.

Я не пробовал программировать на Javascript, но у меня есть код решения на C ++, поэтому вы можете проверить алгоритм:

int numbersList[10] = {1,2,3,4,5,6,7,8,9,10};
    int targetNumber;

    cout<<"Enter target number: ";
    cin>>targetNumber;

    int a=numbersList[9], b=numbersList[9], c=numbersList[9];

    if (a+b+c==targetNumber)
    {
        cout<<"Answer: a="<<a<<" b="<<b<<" c="<<c<<endl;
    } else {
        int aPos=9, bPos=9, cPos=9;
        for(int i=0 ; i<719 ; i++)
        {
            a = numbersList[aPos];
            b = numbersList[bPos];
            c = numbersList[cPos];
            if (a+b+c==targetNumber)
            {
                cout<<"Possible! a="<<a<<" b="<<b<<" c="<<c<<endl;
                //break;
            } else if (a+b+c>targetNumber)
            {
                if (cPos==0)
                {
                    if (bPos==0)
                    {
                        if (aPos==0)
                        {
                            cout<<"Not possible!"<<endl;
                            break;
                        } else {
                            aPos -=1;
                        }
                    } else {
                        bPos -=1;
                    }
                } else {
                    cPos -=1;
                }
            }
        }
    }

Если вы хотите проверить программу, вы можете попробовать ее здесь -> Нажмите меня

А затем вставьте этот код:

/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

int main()
{
    int numbersList[10] = {1,2,3,4,5,6,7,8,9,10};
    int targetNumber;

    cout<<"Enter target number: ";
    cin>>targetNumber;

    int a=numbersList[9], b=numbersList[9], c=numbersList[9];

    if (a+b+c==targetNumber)
    {
        cout<<"Answer: a="<<a<<" b="<<b<<" c="<<c<<endl;
    } else {
        int aPos=9, bPos=9, cPos=9;
        for(int i=0 ; i<719 ; i++)
        {
            a = numbersList[aPos];
            b = numbersList[bPos];
            c = numbersList[cPos];
            if (a+b+c==targetNumber)
            {
                cout<<"Possible! a="<<a<<" b="<<b<<" c="<<c<<endl;
                //break;
            } else if (a+b+c>targetNumber)
            {
                if (cPos==0)
                {
                    if (bPos==0)
                    {
                        if (aPos==0)
                        {
                            cout<<"Not possible!"<<endl;
                            break;
                        } else {
                            aPos -=1;
                        }
                    } else {
                        bPos -=1;
                    }
                } else {
                    cPos -=1;
                }
            }
        }
    }
    return 0;
}

Надеюсь, вы получили свой ответ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...