您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“php回溯算法計(jì)算組合總和的方法”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“php回溯算法計(jì)算組合總和的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
給定一個(gè)數(shù)組 candidates 和一個(gè)目標(biāo)數(shù) target ,找出 candidates 中所有可以使數(shù)字和為 target 的組合。
candidates 中的每個(gè)數(shù)字在每個(gè)組合中只能使用一次。
所有數(shù)字(包括目標(biāo)數(shù))都是正整數(shù)。 解集不能包含重復(fù)的組合。
輸入:
candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]]
直接參考回溯算法團(tuán)滅排列/組合/子集問(wèn)題。
class Solution { /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */ public $res = []; function combinationSum2($candidates, $target) { sort($candidates); // 排序 $this->dfs([], $candidates, $target, 0); return $this->res; } function dfs($array, $candidates, $target, $start) { if ($target < 0) return; if ($target === 0) { $this->res[] = $array; return; } $count = count($candidates); for ($i = $start; $i < $count; $i++) { if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; $array[] = $candidates[$i]; $this->dfs($array, $candidates, $target - $candidates[$i], $i + 1);//數(shù)字不能重復(fù)使用,需要+1 array_pop($array); }}
實(shí)例擴(kuò)展:
<?php /* * k = 2x + y + 1/2z 取值范圍 * 0 <= x <= 1/2k * 0 <= y <= k * 0 <= z < = 2k * x,y,z最大值 2k */ $daMi = 100; $result = array(); function isOk($t,$daMi,$result) {/*{{{*/ $total = 0; $hash = array(); $hash[1] = 2; $hash[2] = 1; $hash[3] = 0.5; for($i=1;$i<=$t;$i++) { $total += $result[$i] * $hash[$i]; } if( $total <= $daMi) { return true; } return false; }/*}}}*/ function backtrack($t,$daMi,$result) {/*{{{*/ //遞歸出口 if($t > 3) { //輸出最優(yōu)解 if($daMi == (2 * $result[1] + $result[2] + 0.5 * $result[3])) { echo "最優(yōu)解,大米:${daMi},大牛:$result[1],中牛: $result[2],小牛:$result[3] "; } return; } for($i = 0;$i <= 2 * $daMi;$i++) { $result[$t] = $i; //剪枝 if(isOk($t,$daMi,$result)) { backtrack($t+1,$daMi,$result); } $result[$t] = 0; } }/*}}}*/ backtrack(1,$daMi,$result); ?>
讀到這里,這篇“php回溯算法計(jì)算組合總和的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。