当前位置:首页 > PHP教程 > php应用 > 列表

使用php计算排列组合的方法

发布:smiling 来源: PHP粉丝网  添加日期:2020-06-28 16:13:40 浏览: 评论:0 

本文用PHP要解决的数学问题是算出C(a,1) * C(b, 1) * ... * C(n, 1)的组合情况,其中C(n, 1)代表从n个元素里任意取一个元素,前些天因为业务需要写了一段计算排列组合的代码,今天整理了一下,以备后用:

  1. <?php 
  2. /** 
  3.  * 要解决的数学问题    :算出C(a,1) * C(b, 1) * ... * C(n, 1)的组合情况,其中C(n, 1)代表从n个元素里任意取一个元素 
  4.  * 
  5.  * 要解决的实际问题样例:某年级有m个班级,每个班的人数不同,现在要从每个班里抽选一个人组成一个小组, 
  6.  *                       由该小组来代表该年级参加学校的某次活动,请给出所有可能的组合 
  7.  */ 
  8. /* ################################### 开始计算 ################################### */ 
  9. /** 
  10.  * 需要进行排列组合的数组 
  11.  * 
  12.  * 数组说明:该数组是一个二维数组,第一维索引代表班级编号,第二维索引代表学生编号 
  13.  */ 
  14. $CombinList = array(1 => array("Student10""Student11"), 
  15.                     2 => array("Student20""Student21""Student22"), 
  16.                     3 => array("Student30"), 
  17.                     4 => array("Student40""Student41""Student42""Student43")); 
  18. /* 计算C(a,1) * C(b, 1) * ... * C(n, 1)的值 */ 
  19. $CombineCount = 1; 
  20. foreach($CombinList as $Key => $Value
  21.     $CombineCount *= count($Value); 
  22. $RepeatTime = $CombineCount
  23. foreach($CombinList as $ClassNo => $StudentList
  24.     // $StudentList中的元素在拆分成组合后纵向出现的最大重复次数 
  25.     $RepeatTime = $RepeatTime / count($StudentList); 
  26.     $StartPosition = 1; 
  27.     // 开始对每个班级的学生进行循环 
  28.     foreach($StudentList as $Student
  29.     { 
  30.         $TempStartPosition = $StartPosition
  31.         $SpaceCount = $CombineCount / count($StudentList) / $RepeatTime
  32.         for($J = 1; $J <= $SpaceCount$J ++) 
  33.         { 
  34.             for($I = 0; $I < $RepeatTime$I ++) 
  35.             { 
  36.                $Result[$TempStartPosition + $I][$ClassNo] = $Student
  37.             } 
  38.             $TempStartPosition += $RepeatTime * count($StudentList); 
  39.         } 
  40.         $StartPosition += $RepeatTime
  41.     } //phpfensi.com 
  42. /* 打印结果 */ 
  43. echo "<pre>"
  44. print_r($Result); 
  45. ?> 

Tags: php计算排列组合

分享到: