1. 程式人生 > 程式設計 >php回溯演算法計算組合總和的例項程式碼

php回溯演算法計算組合總和的例項程式碼

給定一個數組 candidates 和一個目標數 target ,http://www.cppcns.com找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次。

說明

所有數字(包括目標數)都是正整數。 解集不能包含重複的組合。

例項

輸入:

candidates = [10,1,2,7,6,5],target = 8,

所求解集為:

[
[1,7],
[1,
[2,6],6]]

解題思路

直接參考回溯演算法團滅排列/組合/子集問題。

程式碼

class Solution {
    /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */
    public $res = [];
    function combinationSum2($candidates,$target) {
        sort($candidates);http://www.cppcns.com
// 排序 $this->dwww.cppcns.comfs([],$candidates,$target,0); return $this->res; } function dfs($array,$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,$target - $candidates[$i],$i + 1);//數字不能重複使用,需要+1 array_pop($array); }}

例項擴充套件:

<?
/*
 * 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,$result)
{/*{{{*/
 //遞迴出口
 if($t > 3)
 {
 //輸出最優解
 if($daMi == (2 * $result[1] + $result[2] + 0.5 * $result[3]))
 {
  echo "最優解,大米:${daMi},大牛:$result[1],中牛: $result[2],小牛:$result[3]\n";
 }
 return;
 }
 for($i = 0;$i <= 2 * $daMi;$
i++) { $result[$t] = $i; //剪www.cppcns.com枝 if(isOk($t,$result)) { backtrack($t+1,$result); } $result[$t] = 0; } }/*}}}*/ backtrack(1,$result); ?>

到此這篇關於php回溯演算法計算組合總和的例項程式碼的文章就介紹到這了,更多相關php回溯演算法計算組合總和的方法內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!