2014-02-19 76 views
0

我想弄清楚如何循環出x個整數的可能組合來總結一個指定的數字。找出x個整數的總和來給定數字的總和

比方說,我有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; 
      } 
     } 
    } 
?> 

謝謝你的時間和精力。

問候, 雅各

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

你應該提供兩個選項 目標=你的號碼 最大=你的號碼 它會給你所有可能的序列。 –

+0

對不起,但它並沒有給出所有可能的序列。使用你的功能,像這樣printPartitions(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將是達到這個目標的最高數字。感謝你的努力,我appriciate它:) – entiendoNull

相關問題