2014-02-19 3 views
0

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

Скажем, у меня есть номер 7, и мне нужно, чтобы выяснить, как я могу суммировать это число с целыми числами в парах 3. 1 + 2 + 4 = 7

3 + 3 + 1 = 7

5 + 1 + 1 = 7

2 + 2 + 3 = 7

Повторные комбинации чисел не интересуют меня, например:

1 + 2 + 4 = 7

2 + 4 + 1 = 7

4 + 2 + 1 = 7

Кто есть какие-либо идеи о том, как мне действовать, чтобы достичь этого результата? Спасибо.

+5

Это звучит как домашнее задание - вы пробовали * ничего * себя, или мы должны сделать все для вас? – h2ooooooo

+1

Существует бесконечное число целых комбинаций, которые приводят к 7. Для каждого X вы можете сделать «7 + X + (-X) = 7'. Возможно, вы ищете комбинацию натуральных чисел? – Mureinik

+0

Это, честно говоря, не проблема домашней работы, уверяю вас. Попытки, которые я сделал, действительно не были хорошими, поэтому я не публиковал их. Теперь я понимаю, что должен. Я никогда не просил полного решения этой проблемы, просто идеи я должен продолжить :) – entiendoNull

ответ

0

У меня есть решение моей проблемы. Я чувствую, что мне следует делиться этим здесь, если кому-то это понадобится. Мои решения основаны на этом посту: https://stackoverflow.com/a/19067884/3293843

<?php 
function sampling($chars, $size, $combinations = array()) { 
    # if it's the first iteration, the first set 
    # of combinations is the same as the set of characters 
    if (empty($combinations)) { 
     $combinations = $chars; 
    } 

    # we're done if we're at size 1 
    if ($size == 1) { 
     return $combinations; 
    } 

    # initialise array to put new values in 
    $new_combinations = array(); 

    # loop through existing combinations and character set to create strings 
    foreach ($combinations as $combination) { 
     foreach ($chars as $char) { 
      $new_combinations[] = $combination .'@'. $char; 
     } 
    } 

    # call same function again for the next iteration 
    return sampling($chars, $size - 1, $new_combinations); 

} 

// example 
$chars = array('1', '2', '3','4'); 
$target = 7; 
$maxLengthOfIntegers = 3; 
$output = sampling($chars, $maxLengthOfIntegers); 
$repeatedEntries = array(); 


//presenting the output 
foreach($output as $out){ 
    $explodeOut = explode('@',$out); 
    sort($explodeOut); 
    if(array_sum($explodeOut) == $target){ 
     $sortedPattern = implode('',$explodeOut); 
     if(!in_array($sortedPattern,$repeatedEntries)){ 
      echo $sortedPattern.'<br/>'; 
      $repeatedEntries[] = $sortedPattern; 
      } 
     } 
    } 
?> 

Спасибо за ваше время и усилия.

С уважением, Jacob

0

вы можете попробовать этот алгоритм

$ans = array(); 
for($i=1;$i<=5;$i++) 
{ 
    $i1 = 7-$i; 
    $i2 = intval($i1 - $i); 
    $value = $i."+".$i1."+".$i2; 
    $ans = array_unshift($ans,$value); 
} 

print_r($ans); 

надежду, что это помогает .. Пожалуйста, дайте мне знать

0

Вот решение вашей проблемы.

function printPartitions($target, $max, $s){ 
    if($target === 0) 
     echo $s; 
    else 
     { 
      if($max > 1) 
      { 
       printPartitions($target, $max-1, $s); 
      } 
      if($max <= $target) 
      { 
       printPartitions($target-$max, $max, $max . " " . $s); 
      } 
     } 
} 

printPartitions(5, 5, "<br/>"); 

Необходимо указать значение $ target Value, $ max.

например.

printPartitions(7, 7, "<br/>"); 

Это даст вам выход, как:

1 1 1 1 1 1 1 
1 1 1 1 1 2 
1 1 1 2 2 
1 2 2 2 
1 1 1 1 3 
1 1 2 3 
2 2 3 
1 3 3 
1 1 1 4 
1 2 4 
3 4 
1 1 5 
2 5 
1 6 
7 
+0

Огромное вам спасибо за ваши усилия, но это все еще не так. Указание числа 7 в качестве моей цели и 3 как максимальное число для суммирования целых чисел. Таким образом, результаты печати не могут содержать больше (не меньше), чем 3 целых числа (2 + 4 + 1 = 7, 3 + 3 + 1 = 7), чтобы суммировать цель. – entiendoNull

+0

Ваш должен предоставить два варианта: Target = Ваш номер Макс = Ваш номер Он предоставит вам все возможные последовательности. –

+0

Извините, но это не дает всех возможных последовательностей. Использование вашей функции, такой как этапы печати (7, 3, «
»); (я буду использовать скобки для разделения потерянных разрывов здесь): [1 1 1 1 1 1 1] [1 1 1 1 1 2] [1 1 1 2 2] [1 2 2] 2] [1 1 1 1 3] [1 1 2 3] [2 2 3] [1 3 3] Возможные комбинации также включают примеры, размещенные в моем предыдущем ответе. Используя номер 3 в качестве макс, я имел в виду использование 3 целых чисел для суммирования цели - не то, что 3 будет наивысшим числом, используемым для достижения этого. Спасибо за эти усилия, я его оцениваю :) – entiendoNull

Смежные вопросы