php回溯算法计算组合总和的实例代码

吾爱主题 阅读:178 2021-11-21 17:16:00 评论:0

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明

所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。

实例

输入:

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

所求解集为:

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

解题思路

直接参考回溯算法团灭排列/组合/子集问题。

代码

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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); //数字不能重复使用,需要+1              array_pop ( $array );      }}

实例扩展:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <?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)   {   //输出最优解   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 ;   //剪枝   if (isOk( $t , $daMi , $result ))   {    backtrack( $t +1, $daMi , $result );   }   $result [ $t ] = 0;   } } /*}}}*/ backtrack(1, $daMi , $result ); ?>

到此这篇关于php回溯算法计算组合总和的实例代码的文章就介绍到这了,更多相关php回溯算法计算组合总和的方法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.py.cn/php/jiaocheng/31574.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容