收藏一个排列组合的算法
``
public function ceshi2(){
$arr=[1,2,3,4,5,7,8,8,8,8,8,8,8,8,8]; //要组合的号码
$step= 3;//组合数 如22 组合 33 组合
$huoqu=$this->comb($arr,$step);
//$huoqu=$this->perm($arr,$step);
echo "<pre>";print_r($huoqu);echo "<pre>";
}
这个函数解决:有N个数,任意从其中取m个,有几种取法,不限制数字摆放位置
//从$input数组中取$m个数的组合算法
public function comb($input, $m){
if(count($input)<$m){return '数组长度不够';}
if($m==1){
foreach($input as $item){
$result[]=array($item);
}
return $result;
}
for($i=0;$i<=count($input)-$m;$i++){
$nextinput=array_slice($input,$i+1);
$nextresult=$this->comb($nextinput,$m-1);
foreach($nextresult as $one){
$result[]=array_merge(array($input[$i]),$one);
}
}
return $result;
}
这个函数解决:有N个数,任意从其中取m个,有几种取法,数字摆放顺序不同
//从$input数组中取$m个数的排列算法
public function perm($input,$m){
if(count($input)<$m){return '数组长度不够';}
if($m==1){
foreach($input as $item){
$result[]=array($item);
}
return $result;
}
for($i=0;$i<count($input);$i++){
$nextinput=array_merge(array_slice($input,0,$i),array_slice($input,$i+1));
$nextresult=$this->perm($nextinput,$m-1);
foreach($nextresult as $one){
$result[]=array_merge(array($input[$i]),$one);
}
}
return $result;
}