我想弄清楚如何循環出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
任何人有我應該如何着手實現這一結果的任何想法? 謝謝。
我想弄清楚如何循環出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
任何人有我應該如何着手實現這一結果的任何想法? 謝謝。
我有一個解決我的問題。我覺得我應該在這裏分享,如果有人會需要的話。我的解決方案是基於這個職位: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;
}
}
}
?>
謝謝你的時間和精力。
問候, 雅各
你可以試試這個算法
$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);
希望這有助於..請讓我知道
這裏是你的問題的解決方案。
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
非常感謝您的努力,但它仍然沒有做正確的事情。將數字7指定爲我的目標,將3指定爲要求和的整數的最大數字。因此,打印的結果不能包含更多(不少於)3個整數(2 + 4 + 1 = 7,3 + 3 + 1 = 7)以對目標進行求和。 – entiendoNull
你應該提供兩個選項 目標=你的號碼 最大=你的號碼 它會給你所有可能的序列。 –
對不起,但它並沒有給出所有可能的序列。使用你的功能,像這樣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
這聽起來像功課 - 你試過* *什麼自己,或我們應該爲你做的一切? – h2ooooooo
有無數個整數組合,結果爲7.對於每個X,你可以做'7 + X +(-X)= 7'。你是否正在尋找自然數的組合? – Mureinik
老實說,這不是一個家庭作業問題,我向你保證。 我做的嘗試真的不好,所以我沒有發佈。我現在意識到我應該有。我從來沒有要求這個問題的完整解決方案,只是簡單的想法應該繼續:) – entiendoNull