給定一個數(shù)組 candidates 和一個目標數(shù) target ,找出 candidates 中所有可以使數(shù)字和為 target 的組合。
candidates 中的每個數(shù)字在每個組合中只能使用一次。
說明
所有數(shù)字(包括目標數(shù))都是正整數(shù)。 解集不能包含重復的組合。
實例
輸入:
candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]]
解題思路
直接參考回溯算法團滅排列/組合/子集問題。
代碼
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ù)字不能重復使用,需要+1
array_pop($array);
}}
實例擴展:
?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]\n";
}
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回溯算法計算組合總和的實例代碼的文章就介紹到這了,更多相關php回溯算法計算組合總和的方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- PHP基于回溯算法解決n皇后問題的方法示例
- PHP實現(xiàn)的回溯算法示例